使用React实现表格行动画效果

3

我有一个用React渲染的表格(大约100行),但是我希望每一行都逐个出现。在React中有没有办法实现这个效果?下面是我的React代码(willMount过程中的derivePairs函数提供了表格数据)。

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个回答

2
您可以使用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-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;
}

@Bostjan,看起来你还没有使用ReactCSSTransitionGroup组件包装行。如果没有看到你当前的代码,很难理解。你能在pastebin.com上上传它吗? - 1ven
感谢您的帮助...我也已经将代码上传到pastebin:http://pastebin.com/dWnay05w,虽然您也可以在我第一条评论中发布的链接的源代码中看到它。 - Bostjan
太好了!现在它可以用了,谢谢。如果可以的话,我再问一个问题...是否可以实现一行一行逐渐淡入的效果?我想@Ori Drori在他的评论中提到过这个建议。 - Bostjan
@OriDrori,我只是想问一下,为什么在这行代码中要使用不同的引号:style={{ 'transition-delay': ${index * delay}ms }}。 - Bostjan
这些引号是用于 ES6 模板字面量的。 - Ori Drori
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接