我是React的新手。我用一个按钮和一个图像网址列表制作了一个小应用程序。单击按钮时,图像URL将添加到列表中。我使用标准.map
函数渲染图像网址列表。
我希望在显示图像时制作快速的ui动画效果:淡入和从左侧滑入的组合。我尝试了Velocity.js并找到了velocity-react
包装器。但我无法理解如何使用它。 “标准”velocity-animate
库也是如此。
什么是最好的? velocity-react
,velocity-animate
或其他什么?
我该怎么做?
JSX
<div className="row">
{
this.state.images.map( (image, index) => { return this.renderThumb(image, index); } )
}
</div>
renderThumb函数
renderThumb(image, index) {
return (
<div ref="tweetImage" key={`image-${index}`} className="col-xs-3 tweetImage">
<img className="img-thumbnail" src={image} alt="my pic"/>
</div>
);
}
速度反应的
我试图将<img>
动画不透明度从0翻译为1,如下所示(从文档中复制):
<VelocityComponent animation={{ opacity: 1 }} duration={ 500 }>
<img className="img-thumbnail" src={image} alt="my pic"/>
</VelocityComponent
我一直收到这个错误:
警告:React.createElement:type无效 - 期望一个字符串(对于内置组件)或类/函数(对于复合组件)但得到:object
ReactCSSTransitionGroup
也没有运气(如下面的建议)。显示图像但没有动画:
renderThumb(image, index) {
return (
<div ref="tweetImage" key={`image-${index}`} className="col-xs-3">
<ReactCSSTransitionGroup
transitionName="example">
<img className="img-thumbnail" src={image} alt="Ole Frank Jensen"/>
</ReactCSSTransitionGroup>
</div>
);
}
解决:
我将<ReactCSSTransitionGroup transitionName="example">
移到了衰落的组件之外并且瞧瞧: - )
渲染()
<div className="row">
<ReactCSSTransitionGroup transitionName="example">
{
this.state.images.map( (image, index) => { return this.renderThumb(image, index); } )
}
</ReactCSSTransitionGroup>
</div>
renderThumb()
renderThumb(image, index) {
return (
<div key={`image-${index}`} className="col-xs-3">
<img className="img-thumbnail" src={image} alt="Ole Frank Jensen"/>
</div>
);
}
答案 0 :(得分:0)
我建议使用React CSS Transistion Group模块。它为简单的动画提供了高级动画包装。
来自文档
.example-enter {
opacity: 0.01;
}
.example-enter.example-enter-active {
opacity: 1;
transition: opacity 500ms ease-in;
}
.example-leave {
opacity: 1;
}
.example-leave.example-leave-active {
opacity: 0.01;
transition: opacity 300ms ease-in;
}
其中example
将是您要绘制的组件的transistionName。并且-enter,enter-active,-leave,-leave-active
代表动画周期的相应刻度。这些内容将由React在内部添加为项目的类名。
您可以使用它们来达到所需的效果。一个小型演示here。
P.S:不确定这是否优于Velocity.js,还没有使用过。
答案 1 :(得分:0)
您可以使用react提供的CSSTransitionGroup。
https://facebook.github.io/react/docs/animation.html
来自文档的简单todo例子
class TodoList extends React.Component {
constructor(props) {
super(props);
this.state = {items: ['hello', 'world', 'click', 'me']};
this.handleAdd = this.handleAdd.bind(this);
}
handleAdd() {
const newItems = this.state.items.concat([
prompt('Enter some text')
]);
this.setState({items: newItems});
}
handleRemove(i) {
let newItems = this.state.items.slice();
newItems.splice(i, 1);
this.setState({items: newItems});
}
render() {
const items = this.state.items.map((item, i) => (
<div key={item} onClick={() => this.handleRemove(i)}>
{item}
</div>
));
return (
<div>
<button onClick={this.handleAdd}>Add Item</button>
<ReactCSSTransitionGroup
transitionName="example"
transitionEnterTimeout={500}
transitionLeaveTimeout={300}>
{items}
</ReactCSSTransitionGroup>
</div>
);
}
}