React中常见的动画实现的几种方式(3)

state 用于控制元素是否显示,另一个 state 用于控制元素在动画中的变化属性。在这种情况下,开发者需要花费大量精力来维护组件的动画逻辑,十分复杂繁琐。

三、React 动画插件 CssTransitionGroup

React 曾为开发者提供过动画插件 react-addons-css-transition-group ,后交由社区维护,形成现在的 react-transition-group ,该插件可以方便地实现组件的入场和离场动画,使用时需要开发者额外安装。 react-transition-group 包含 CSSTransitionGroupTransitionGroup 两个动画插件,其中,后者是底层 api,前者是后者的进一步封装,可以较为便捷地实现 css 动画。

示例

以一个动态增加tab的为例,代码如下:

import React, { Component } from 'react'; 
import { CSSTransitionGroup } from 'react-transition-group';

let uid = 2; 
export default class Tabs extends Component { 
  constructor(props) {
    super(props);
    this.state = {
      activeId: 1,
      tabData: [{
        id: 1,
        panel: '选项1'
      }, {
        id: 2,
        panel: '选项2'
      }]
    };
  }

  addTab = () => {
    // 添加tab代码
    ...
  }

  deleteTab = (id) => {
    // 删除tab代码
    ...
  }

  render() {
    const { tabData, activeId } = this.state;

    const renderTabs = () => {
      return tabData.map((item, index) => {
        return (
          <div
            className={`tab-item${item.id === activeId ? ' tab-item-active' : ''}`}
            key={`tab${item.id}`}
          >
            {item.panel}
            <span className="btns btn-delete" onClick={() => this.deleteTab(item.id)}>✕</span>
          </div>
        );
      })
    }

    return (
      <div>
        <div className="tabs" >
          <CSSTransitionGroup
           transitionName="tabs-wrap"
           transitionEnterTimeout={500}
           transitionLeaveTimeout={500}
          >
           {renderTabs()}
          </CSSTransitionGroup>
          <span className="btns btn-add" onClick={this.addTab}>+</span>
        </div>
        <div className="tab-cont">
          cont
        </div>
      </div>
    );
  }
}
/* tab动态增加动画 */
.tabs-wrap-enter {
 opacity: 0.01;
}

.tabs-wrap-enter.tabs-wrap-enter-active {
 opacity: 1;
 transition: all 500ms ease-in;
}

.tabs-wrap-leave {
 opacity: 1;
}

.tabs-wrap-leave.tabs-wrap-leave-active {
 opacity: 0.01;
 transition: all 500ms ease-in;
}

CSSTransitionGroup 可以为其子节点添加额外的 css 类,然后通过 css 动画达到入场和离场动画效果。为了给每个 tab 节点添加动画效果,需要先将它们包裹在 CSSTransitionGroup 组件中。 当设定

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/270.html