用反应动画表格行

Posted

技术标签:

【中文标题】用反应动画表格行【英文标题】:Animate table rows with react 【发布时间】:2016-12-11 18:16:44 【问题描述】:

我有一个用 react 渲染的表(大约 100 行),但我想要一行一行地出现的效果。有没有办法用 React 做到这一点?下面是我的 React 代码(willMount 过程中的 derivedPairs 函数提供了表格的数据)。

var columns = [
       key: 'pairNo', label: 'Zaporedna številka' ,
       key: 'homeTeam', label: 'Domača ekipa' ,
       key: 'awayTeam', label: 'Gostujoča ekipa' ,
       key: 'score', label: 'Rezultat' 
  ];

  var Table = React.createClass(

      getInitialState: function() 
        return data: this.props.data;
      ,

      componentWillMount: function() 
        derivePairs();
      ,

      render: function() 
          var headerComponents = this.generateHeaders(),
              rowComponents = this.generateRows();

          return (
              <table>
                  <thead>headerComponents</thead>
                  <tbody>rowComponents</tbody>
              </table>
          );
      ,

      generateHeaders: function() 
          var cols = this.props.cols;  // [key, label]

          // generate our header (th) cell components
          return cols.map(function(colData) 
              return <th key=colData.key>colData.label</th>;
          );
      ,

      generateRows: function() 
          var cols = this.props.cols,  // [key, label]
              data = this.props.data;

          var round=1;
          var pairNo=1;
          var oldRound=0;
          var teamName=null;
          return this.state.data.map(function(item, i) 
              // handle the column data within each row
              var htmlExcerpt = null;
              var len = Object.keys(cols).length;
              if (oldRound !== item.round) 
                  i=i+1;
                  htmlExcerpt = <tr key='round'+item.round><td colSpan=len>Round: item.round</td></tr>;
                  oldRound = item.round;
              
              var cells = cols.map(function(colData) 
                  console.log(colData);
                  // colData.key might be "firstName"
                  if (colData.key == "pairNo") 
                    return (<td> pairNo </td>);
                   else 
                    if (colData.key == "homeTeam" || colData.key == "awayTeam") 
                      teamName = config.teams[item[colData.key]].name;
                      return (<td> teamName </td>);
                     else 
                      return (<td> item[colData.key] </td>);
                    
                  
              );
              if (htmlExcerpt !== null) 
                return [htmlExcerpt,<tr className=enter-data key=i> cells </tr>];
               else 
                return <tr className=enter-data key=i> cells </tr>;
              
              pairNo=pairNo+1;
          );
      
  );

  ReactDOM.render(<Table cols=columns data=config.pairs/>, document.getElementById('roundPairs'));

感谢您的帮助。

【问题讨论】:

【参考方案1】:

您可以通过使用ReactCSSTransitionGroup 包来实现此目的。

你的render 方法应该是这样的:

// ...

render: function() 
    var headerComponents = this.generateHeaders(),
        rowComponents = this.generateRows();

    return (
        <table>
            <thead>headerComponents</thead>
            <ReactCSSTransitionGroup
              transitionName="fade"
              transitionEnterTimeout=500
              transitionLeaveTimeout=300
              transitionAppearTimeout=500
              transitionAppear=true
              component="tbody"
            >
              rowComponents
            </ReactCSSTransitionGroup>
        </table>
    );
,

// ...

接下来,您应该定义 css 类。对于fade 动画名称,它们应该是:

.fade-enter 
  opacity: 0.01;


.fade-enter.fade-enter-active 
  opacity: 1;
  transition: opacity 500ms ease-in;


.fade-leave 
  opacity: 1;


.fade-leave.fade-leave-active 
  opacity: 0.01;
  transition: opacity 300ms ease-in;


.fade-appear 
  opacity: 0.01;


.fade-appear.fade-appear-active 
  opacity: 1;
  transition: opacity .5s ease-in;

【讨论】:

感谢您的帮助,但即使这样做了,它仍然只是显示而没有任何淡入淡出效果。桌子立即出现。请查看:bobr.si/react/index_new.html @Bostjan,看起来你没有用ReactCSSTransitionGroup 组件包装行。很难理解,没有看到您当前的代码。你能把它上传到pastebin.com吗? 感谢您的帮助...我还将代码上传到 pastebin:pastebin.com/dWnay05w 虽然您也可以在我在第一条评论中发布的链接的源代码中看到它跨度> 这个solution 也可能适用于您的情况。问题是一样的 - 如何在初始渲染中一个接一个地为元素设置动画。 @Bostjan,抱歉,一开始我忘了将transitionAppearTimeouttransitionAppear 属性添加到ReactCSSTransitionGroup。此外,您应该添加相应的类。查看更新的答案。

以上是关于用反应动画表格行的主要内容,如果未能解决你的问题,请参考以下文章

如何防止行动画向下滚动 TableHeaderView?

用反应动画表格行

UITableView 行动画持续时间和完成回调

在 ARKit 中进行动画时如何获取 3D 对象的当前位置?

添加具有行动画的单元格时,将 tableview 保持在相同的滚动位置

是否可以在 Google Colaboratory 中进行动画可视化?