react中的动画效果,react-transition-group插件的使用

我们在react中使用动画 如果你不用插件的话
你可以选择使用 transition或者使用keyframes 来做
上面的俩种方法 我不在这里一一赘述 因为今天要说的重点不是这个
我们来讲一讲 react-transition-group 中的动画插件的使用
1.学过vue的同学 可能知道 vue中的动画效果 是用transition 包括标签来实现的
其实吧 很多地点 vue还是借鉴和学习 angular和reaact的
好了废话不多说了 直接上思路和代码了
首选是安装

npm install react-transition-group -S

2.引入和使用

import { CSSTransition }  from "react-transition-group"
import "./index.css"
// 这里也需要有一个状态值 进行控制
constructor(props){
    super(props);
    this.state = {
        show:true
    }
<div>
// CSSTransition 里面包括一个 div标签 一般是要进行动画的 标签
	<CSSTransition
	    in={this.state.show} // 如果this.state.show从false变为true,则动画入场,反之out出场
	    timeout={1000} //动画执行1秒
	    classNames="fade" //自定义的class名           
	>
	  <div className="zyc"></div>// 注意 这里不能是一个变量 否则会报错的
	</CSSTransition>
	<button onClick={this.handleToggole}>切换</button>
</div>
//切换函数
handleToggole=()=> {
      this.setState({
          show: !this.state.show
      })
  }
 // 然后就是样式文件 index.css
//元素的初始样式
.zyc{
    width: 200px;
    height: 200px;
}
 //enter是入场前的刹那(点击按钮),appear指页面第一次加载前的一刹那
.fade-enter, .fade-appear {
    opacity: 0;
    background-color: #f00;
    margin-left: 300px;
}
//enter-active指入场后到入场结束的过程,appear-active则是页面第一次加载自动执行
.fade-enter-active, .fade-appear-active { 
    opacity: 1;
    transition: 1s;
    margin-left: 0;
}
//入场动画执行完毕后,保持状态
.fade-enter-done {
    opacity: 1;
    background-color: #000;

}
//同理,元素 离场前 的瞬间
.fade-exit {
    opacity: 1;
    background-color: #0f0;
}
// 元素 离开的过程中
.fade-exit-active {
    opacity: 0;
    transition: 2s;
    margin-left: 300px;
    background-color: #00f;
}
// 元素 离开的瞬间 要完成的效果
.fade-exit-done {
    opacity: 0;
}

这样就会实现 一个简单的动画效果了
3. 还有一种就是群组的效果 有些时候 我们不仅仅要给一个标签添加 效果 要给数组遍历的结果都加上 动画的效果 这个时候就需要我们引入一个新的 对象 TransitionGroup
这下 里面可以包括 变量了 而不是一个标签

// 这里注意了 老版本 可能是 CSSTransitionGroup 这个已经淘汰了
import { CSSTransition,TransitionGroup }  from "react-transition-group"
// CSSTransition,TransitionGroup 要搭配使用

```javascript
// 先提前准备好一组数据
constructor(props){
    super(props);
    this.state = {
        list: [
          { id: 1, text: '张三' },
          { id: 2, text: '李四' },
          { id: 3, text: '王麻子' },
          { id: 4, text: '狗蛋' },
        ]
    }
}
render() {
    return (
    //  TansitionGroup 里面包括着 CSSTransition  里面的CSSTransition 不用再写in属性
    //因为已经被外边的TransitionGroup 进行管理了 里面的数据删除和添加控制着动画效果
      <div>
        <TransitionGroup className="todo-list">
      {this.state.items.map(({ id, text }) => (
        <CSSTransition
          key={id}
          timeout={2000}
          classNames="show">
          <div className="todo-list-item">
            <button
              className='cancle'
              onClick={() => {
                this.setState(state => ({
                  items: state.items.filter( // es6 过滤数组中的数据
                    item => item.id !== id // 过滤掉 点击的元素
                  ),
                }));
              }}>
              &times;
            </button>
            <span className='item-text'>{text}</span>
          </div>
        </CSSTransition>
      ))}
    </TransitionGroup>  
    <button
    className='add'
    onClick={() => {
      const text = prompt('Enter some text');
      if (text) {
        this.setState(state => ({
        // 每输入一个数据 往数组中插入一条数据
          items: [
            ...state.items,
            { id: state.items[state.items.length-1].id+1, text },
          ],
        }));
      }
    }}>
    添加新数据
  </button>
      </div>
    )
}
// index.css
*{
    margin: 0;
    padding: 0;
}
body{
    background-color: #f1f1f1;
}
.show-enter {
    opacity: 0.01;
  }
.show-enter-active {
    opacity: 1;
    transition: all 300ms ease-out;
}
.show-exit {
    opacity: 1;
}
.show-exit-active {
    opacity: 0.01;
    transition: all 300ms ease-out;
}


.todo-list {
    border-radius: 5px;
    box-shadow: 0 0 5px 1px rgb(202, 202, 202);
}

.todo-list-item {
    height: 35px;
    line-height: 35px;
    padding: 0 10px;
    border-bottom: 1px solid rgb(202, 202, 202);
}

.todo-list-item:last-of-type {
    border-bottom: 0;
}

.item-text {
    margin-left: 10px;
}

.cancle {
    border: 0;
    color: #fff;
    background-color: #F04134;
    border-radius: 3px;
    box-shadow: 0 0 5px 1px rgb(202, 202, 202);
}

.add {
    border: 0;
    height: 30px;
    line-height: 30x;
    width: 120px;
    margin-top: 15px;
    font-size: 14px;
    border-radius: 3px;
    box-shadow: 0 0 5px 1px rgb(202, 202, 202);
}

好了 讲解 到此 结束 希望能帮到 大家 我也是自我提升一下
我找了很多资料 很多都是 2018年的资料 都知道计算机发展比较迅速 平均三个月更新一次
还是尽量跟上技术的发展 。
生活那么苦,为啥不给自己一颗糖吃呢!坚持下去!你会看到不一样的风景!加油 奥利给!


发布了236 篇原创文章 · 获赞 80 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/yunchong_zhao/article/details/104825153