反应:渲染组件时的淡入/滑入动画

时间:2017-03-21 10:10:58

标签: reactjs animation css-animations velocity.js reactcsstransitiongroup

我是React的新手。我用一个按钮和一个图像网址列表制作了一个小应用程序。单击按钮时,图像URL将添加到列表中。我使用标准.map函数渲染图像网址列表。

我希望在显示图像时制作快速的ui动画效果:淡入和从左侧滑入的组合。我尝试了Velocity.js并找到了velocity-react包装器。但我无法理解如何使用它。 “标准”velocity-animate库也是如此。

什么是最好的? velocity-reactvelocity-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>
  );
}

2 个答案:

答案 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>
    );
  }
}