React为动画提供了一个附加组件ReactTransitionGroup,这个附加组件是动画的底层API,并且还提供了一个附件组件ReactCSSTransitionGroup,ReactCSSTransitionGroup能够简单的实现基于css的动画和转换

高级API ReactCSSTransitionGroup

ReactCSSTransitionGroup是一个基于ReactTransitionGroup的API,当一个React组件插入或者移除DOM时,它是一种简单的去执行css转换和动画的方法

以一个demo举例

ReactCSSTransitionGroup是ReactTransitions的接口,可以把它当做一个简单的元素,它包裹着所有想添加动画效果的React组件。下面有一个例子:

var ReactCSSTransitionGroup = require('react-addons-css-transition-group');
var React = require('react');
var ReactDOM = require('react-dom');
var data = ['one','two','three'];
var Control = React.createClass({
getInitialState:function(){
return {
'items':this.props.data
}
},
addItem:function(){
var newItems = this.state.items.concat('four');
this.setState({
'items':newItems
});
},
removeItem:function(i){
var newItems = this.state.items;
newItems.splice(i,1);
this.setState({
'items':newItems
});
},
render:function(){
var $this = this;
var List = this.state.items.map(function(value,index){
return <div key={value} onClick = {$this.removeItem.bind($this,index)}> { value}</div>
});
return (
<div>
<button onClick={this.addItem}>add Item</button>
<ReactCSSTransitionGroup
transitionName='example'
transitionEnterTimeout={500}
transitionLeaveTimeout={300}>
{List}
</ReactCSSTransitionGroup>
</div>
)
}
});
ReactDOM.render(<Control data={data}/> ,document.getElementById('content'));

对例子的解释:

(1)你需要用npm安装react-addons-css-transition-group,然后通过require在文件中引入,然后赋给一个变量,在这里将这个变量命名为ReactCSSTransitionGroup,也可以不取别的名字
(2)为每一个ReactCSSTransitionGroup组件的子元素设置一个key属性,就算它只有一个子元素。key值必须是唯一的。设置一个key属性是为了让react确定那个子元素插入了,移除了,或者保持。

(3)在这个demo中,当一个新的子元素被添加到ReactCSSTransitionGroup中,它就会得到一个example-enter CSS类名,随后它又会得到一个example-enter-active CSS类名。这些类名基于transitionName属性值。你能够使用这个类名去实现css动画。添加如下的css样式:

.example-enter {
opacity: 0.01;
} .example-enter.example-enter-active {
opacity:;
transition: opacity 500ms ease-in;
} .example-leave {
opacity:;
} .example-leave.example-leave-active {
opacity: 0.01;
transition: opacity 300ms ease-in;
}

这些样式中transition-duration值必须与ReactCSSTransitionGroup组件的transitionEnterTimeout和transitionLeaveTimeout属性值一一对应

(4)这个时候你点击'add Item'按钮将会以一种淡入的方式添加一个新的子元素,点击一个已经存在的子元素,这个被点击的子元素将会以一种淡出的方式被移除。

Animate Initial Mounting

ReactCSSTransitionGroup提供了一个可选的属性transitionAppear,如果将这个属性设置为true,在组件的初始化装置就会添加一个额外的转换阶段。默认情况下transitionAppear为false,如下:

render: function() {
return (
<ReactCSSTransitionGroup transitionName="example" transitionAppear={true} transitionAppearTimeout={500}>
{list}
</ReactCSSTransitionGroup>
);
}

这样在初始化装载ReactCSSTransitionGroup时,它的每个子元素都会有一个example-appear CSS类接着会有一个example-appear-active CSS类,如果添加如下的样式:

    .example-appear {
opacity: 0.01;
} .example-appear.example-appear-active {
opacity:;
transition: opacity .5s ease-in;
}

在ReactCSSTransitionGroup的装载阶段就会有一个淡入的动画。在初始化装载阶段,每一个ReactCSSTransitionGroup子元素都是appear而不是enter,然而,子元素进入一个已经存在的ReactCSSTransitionGroup,这个子元素是enter而不是appear

自定义类名

在上面的demo中,我们给transitionName属性设置了一个字符串example,所以,每一个阶段涉及的CSS类名都是以example开头的。我们也可以给transitionName设置一个字符串,这样可以为每一个阶段自定义类名,如下有两种设置方式:

<ReactCSSTransitionGroup
transitionName={ {
enter: 'enter',
enterActive: 'enterActive',
leave: 'leave',
leaveActive: 'leaveActive',
appear: 'appear',
appearActive: 'appearActive'
} }>
{item}
</ReactCSSTransitionGroup> <ReactCSSTransitionGroup
transitionName={ {
enter: 'enter',
leave: 'leave',
appear: 'appear'
} }>
{item2}
</ReactCSSTransitionGroup>

Animation Group Must Be Mounted To Work

为了让每一个子元素都有一个淡入和淡出的效果,子元素必须进入或离开一个已经被装载的ReactCSSTransitionGroup组件中,或者ReactCSSTransitionGroup的transitionAppear属性为true,下面这个例子就不会有淡入和淡出的效果,因为,ReactCSSTransitionGroup和一个新的子元素被单独装载,而不是子元素载入一个已经存在的ReactCSSTransitionGroup中。

render: function() {
var items = this.state.items.map(function(item, i) {
return (
<div key={item} onClick={this.handleRemove.bind(this, i)}>
<ReactCSSTransitionGroup transitionName="example">
{item}
</ReactCSSTransitionGroup>
</div>
);
}, this);
return (
<div>
<button onClick={this.handleAdd}>Add Item</button>
{items}
</div>
);
}

一个或者0个子元素

在上面的例子中ReactCSSTransitionGroup有多个子元素,实际上,ReactCSSTransitionGroup可以只有一个或者没有子元素,如下所示:

var ReactCSSTransitionGroup = require('react-addons-css-transition-group');

    var ImageCarousel = React.createClass({
propTypes: {
imageSrc: React.PropTypes.string.isRequired
},
render: function() {
return (
<div>
<ReactCSSTransitionGroup transitionName="carousel" transitionEnterTimeout={300} transitionLeaveTimeout={300}>
<img src={this.props.imageSrc} key={this.props.imageSrc} />
</ReactCSSTransitionGroup>
</div>
);
}
});

禁用动画

如果你愿意,你能够禁用leave或者enter动画。例如,你想让子元素有一个enter动画而没有一个leave动画,但是在默认情况下,在你移除DOM节点之前,ReactCSSTransitionGroup会等待一个动画去完成。你能给ReactCSSTransitionGroup设置transitionEnter={false} 或者 transitionLeave={false}去禁用这些动画

 

React 附件动画API ReactCSSTransitionGroup的更多相关文章

  1. React常用的API说明

    楼主刚开始学习react,感受到了他的博大精深,看到很多莫名的用法,不知云云,找了很多没有找到参考手册,只有在中文社区和react官方看了一些,收集了一些比较常用的API,有补充的可以楼下评论补充.后 ...

  2. React实现动画效果

    流畅.有意义的动画对于移动应用用户体验来说是非常必要的.和React Native的其他部分一样,动画API也还在积极开发中,不过我们已经可以联合使用两个互补的系统:用于全局的布局动画LayoutAn ...

  3. Web动画API教程2:AnimationPlayer和Timeline

    本文转载: Web动画API教程2:AnimationPlayer和Timeline

  4. Web动画API教程1:创建基本动画

    本人转载自: Web动画API教程1:创建基本动画

  5. React之动画实现

    React之动画实现 一,介绍与需求 1.1,介绍 1,Ant Motion Ant Motion能够快速在 React 框架中使用动画.在 React 框架下,只需要一段简单的代码就可以实现动画效果 ...

  6. 手写一个React-Redux,玩转React的Context API

    上一篇文章我们手写了一个Redux,但是单纯的Redux只是一个状态机,是没有UI呈现的,所以一般我们使用的时候都会配合一个UI库,比如在React中使用Redux就会用到React-Redux这个库 ...

  7. React Hooks & Context API

    React Hooks & Context API responsive website https://reactjs.org/docs/hooks-reference.html https ...

  8. React Native动画总结

    最近在使用react native进行App混合开发,相对于H5的开发,RN所提供的样式表较少,RN中不能使用类似于css3中的动画,因此,RN提供了Animated的API 1.写一个最简单的动画 ...

  9. react过渡动画效果的实现,react-transition-group

    本文介绍react相关的过渡动画效果的实现 有点类似vue的transition组件,主要用于组件mount和unmount之前切换时应用动画效果 安装 cnpm install react-tran ...

随机推荐

  1. thread启动线程

  2. 【matlab】MATLAB程序调试方法和过程

    3.8  MATLAB程序的调试和优化 在MATLAB的程序调试过程中,不仅要求程序能够满足设计者的设计需求,而且还要求程序调试能够优化程序的性能,这样使得程序调试有时比程序设计更为复杂.MATLAB ...

  3. jq 操作radio,设置选中、获取选中值

    <label><input type="radio" name="sex" value="1">男</labe ...

  4. LeetCode189——Rotate Array

    Rotate an array of n elements to the right by k steps. For example, with n = 7 and k = 3, the array  ...

  5. HDU 1811 并查集

    题意: 思路:topo+并查集 #include <cstdio> #include <vector> #include <algorithm> #include ...

  6. 怎样禁用或启用"最近使用的项目"

    1.右击“任务栏”——属性——‘开始’菜单——自定义——高级——去掉“列出我最近打开的文档”的勾选——确定.2.通过“组策略”来修改开始——运行——gpedit.msc——用户配置——管理模板——任务 ...

  7. MySql数据库主主同步配置步骤

    测试环境:  192.168.1.192  192.168.1.193    mysql5.2     配置192服务器:  /usr/local/mysql/bin/mysql -uroot -p ...

  8. python数据结构与算法——冒泡排序

    用两种方式实现,非递归和递归 直接上代码: 先是失败的递归方式,涉及到对象引用的问题: # Bad 想一想为啥不行? def bubblesort_rec_bad(A): if len(A)==1: ...

  9. [读书笔记]java中的类加载器

    以下内容大多来自周志明的<深入理解Java虚拟机>. 类加载器是java的一项创新,也是java流行的重要原因之一,它最初是为了满足java applet的需求而开发出来. 什么是appl ...

  10. LA 3938 动态最大连续和 线段树

    题目链接: https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show ...