reactjs 在 map() 中创建动态包装器元素

reactjs create dynamic wrapper element in map()

我有一些问题可能无法很好地理解 ReactJS 以在每五个步骤中创建动态 div 包装器。更具体地说,这里有一个例子:

render() {
    return (
            <div className='holder'>
              {this.props.elements.map(
                (b,n) => 
                  {n%5 == 0 ? '<div class="grid grid-pad">' : ''}
                  <Component param={b} />
                  {n%5 == 0 ? '</div>' : ''}                 
              )}
            </div>
     )
}

结果应如下所示:

<div class='grid grid-pad'>
  <div class='child'></div>
  <div class='child'></div>
  <div class='child'></div>
  <div class='child'></div>
  <div class='child'></div>
</div>
<div class='grid grid-pad'>
  <div class='child'></div>
  <div class='child'></div>
  ...
</div>
....

因此结果将是每 5 个元素将被包裹在 div。

我知道这不是正确的方法,在这段代码中它实际上会为未关闭的标签产生错误。有什么办法可以实际实现类似的功能。先感谢您。

您可以这样做:

/** @jsx React.DOM */

var Parent = React.createClass({
  getInitialState: function() {
    return {
      list: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
    }
  },
  render: function() {
    return(
      <div>
        <Child elements={this.state.list} />
      </div>
    );
  }
});

var Child = React.createClass({
  render: function() {
    var itemsList = this.props.elements.map(function(element, index) {
      if (index % 5 == 0) {
        return (
          <div> {element} </div>
        );
      }
    });

    return(
      <div>
        {itemsList}
      </div>
    );
  }
});

React.render(<Parent />, document.getElementById('app'));

您将数据保存在 Parent 组件中,然后将其传递给 props 中的 Child 组件。

如果你这样做 console.log(itemsList) 你可以看到 map() 方法内部发生了什么。

这里是JSFiddle


编辑:

在你更新你的问题后,这是我快速破解的东西,这不是最好的方法,但它有效:

/** @jsx React.DOM */

var Parent = React.createClass({
  getInitialState: function() {
    return {
      list: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
    }
  },
  render: function() {
    return(
      <div>
        <Child elements={this.state.list} />
      </div>
    );
  }
});


var Child = React.createClass({
  render: function() {
      var arr_index = -1;
      var itemsList = [];
      var items = this.props.elements.map(function(item, i) {
        if (i % 5 == 0) {
          arr_index += 1
        }
        itemsList.push(<div> {item}, conatiner: {arr_index} </div>)
      });
      return (
        <div>{itemsList}</div>
      );
    }
});

React.render(<Parent />, document.getElementById('app'));

您仍然需要稍微调整一下以满足您的要求,但基本上它将 children 分成 "containers",我想这就是您要找的东西。

因为您不能像那样从字符串动态创建 React 组件。您只需要手动对子项进行分组,然后将它们作为一个整体添加到 render 方法中的容器中。

这是一个例子:http://jsfiddle.net/wiredprairie/ko8so1mu/

如果您使用 lodash 之类的东西,您可以使用 take 函数减少下面的代码行数。

render() {
    // make all elements into Components
    var elements = this.props.elements || [];
    var components = elements.map(
        (b) => {
            return <Component param={b} />;
        }
    );

    // then just group into chunks of 5 
    var groups = [];
    var children = [];
    while(components.length > 0) {
        children.push(components.shift());
        if (children.length === 5) {
            groups.push(<div className="grid grid-pad">{children}</div>);
            children = [];
        }
    }
    // remaining children
    if (children.length > 0 ) {
        groups.push(<div className="grid grid-pad">{children}</div>);
    }

    return (
        <div className='holder'>
          { groups }
        </div>
     );
 }