我正在尝试将jQuery组件转换为React.js,而我遇到的困难之一是基于for循环渲染n个元素。
我了解这是不可能的,也不建议这样做,并且在模型中存在数组的地方使用它完全有意义map。很好,但是当您没有数组时该怎么办?取而代之的是,您拥有一个等于要渲染的给定元素数量的数值,那么您应该怎么做?
map
这是我的示例,我想根据元素的层次结构级别为元素添加任意数量的span标签。因此,在第3级,我要在text元素之前添加3个span标签。
在javascript中:
for (var i = 0; i < level; i++) { $el.append('<span class="indent"></span>'); } $el.append('Some text value');
我似乎无法得到这个,或者与JSX React.js组件中的工作类似的东西。相反,我必须执行以下操作,首先将临时数组构建为正确的长度,然后循环该数组。
React.js
render: function() { var tmp = []; for (var i = 0; i < this.props.level; i++) { tmp.push(i); } var indents = tmp.map(function (i) { return ( <span className='indent'></span> ); }); return ( ... {indents} "Some text value" ... ); }
当然,这不是最好的方法还是唯一的方法?我想念什么?
更新:从React > 0.16开始
渲染方法不一定必须返回单个元素。也可以返回一个数组。
var indents = []; for (var i = 0; i < this.props.level; i++) { indents.push(<span className='indent' key={i}></span>); } return indents;
要么
return this.props.level.map((item, index) => ( <span className="indent" key={index}> {index} </span> ));
此处的文档介绍了有关JSX子级的信息
旧:
您可以改用一个循环
var indents = []; for (var i = 0; i < this.props.level; i++) { indents.push(<span className='indent' key={i}></span>); } return ( <div> {indents} "Some text value" </div> );
您还可以使用 .map 和fancy es6
return ( <div> {this.props.level.map((item, index) => ( <span className='indent' key={index} /> ))} "Some text value" </div> );
同样,您必须将返回值包装在容器中。我在上面的示例中使用了div
正如文档在这里说的
当前,在组件的渲染中,您只能返回一个节点。如果您有要返回的div列表,则必须将组件包装在div,span或任何其他组件中。