如果你还没有数组 map() 喜欢@FakeRainBrigand的答案,并且想要内联这个,所以源布局对应的输出比@ SophieAlpert的答案更接近:
map()
http://plnkr.co/edit/mfqFWODVy8dKQQOkIEGV?p=preview
<tbody> {[...Array(10)].map((x, i) => <ObjectRow key={i} /> )} </tbody>
回复:与巴别塔,它的转变 警告页面 说 Array.from 传播需要,但目前( v5.8.23 )传播实际情况时似乎并非如此 Array 。我有一个 文档问题 公开澄清一下。但请自担风险或使用polyfill。
Array.from
v5.8.23
Array
Array.apply
<tbody> {Array.apply(0, Array(10)).map(function (x, i) { return <ObjectRow key={i} />; })} </tbody>
http://plnkr.co/edit/4kQjdTzd4w69g8Suu2hT?p=preview
<tbody> {(function (rows, i, len) { while (++i <= len) { rows.push(<ObjectRow key={i} />) } return rows; })([], 0, 10)} </tbody>
保持源布局对应于输出,但使内联部分更紧凑:
render: function () { var rows = [], i = 0, len = 10; while (++i <= len) rows.push(i); return ( <tbody> {rows.map(function (i) { return <ObjectRow key={i} index={i} />; })} </tbody> ); }
同 Array.prototype.fill 你可以这样做,作为使用传播的替代方案,如上图所示:
Array.prototype.fill
<tbody> {Array(10).fill(1).map((el, i) => <ObjectRow key={i} /> )} </tbody>
(我认为你实际上可以省略任何争论 fill() ,但我不是百分之百。)感谢@FakeRainBrigand纠正我早期版本的错误 fill() 解决方案(见修订版)。
fill()
key
在所有情况下 key attr通过开发构建减轻了警告,但是在孩子身上无法访问。如果您希望子项中的索引可用,则可以传递额外的attr。看到 列表和键 讨论。
如果numrows是一个数组,那很简单。
<tbody> {numrows.map(item => <ObjectRow />)} </tbody>
React中的数组数据类型非常好,数组可以支持新数组,并支持过滤,减少等。
ES2015 / Babel的可能性是使用生成器函数来创建JSX数组:
function* jsxLoop(times, callback) { for(var i = 0; i < times; ++i) yield callback(i); } ... <tbody> {[...jsxLoop(numrows, i => <ObjectRow key={i}/> )]} </tbody>
您还可以使用自调用功能:
return <tbody> {(() => { let row = [] for (var i = 0; i < numrows; i++) { row.push(<ObjectRow key={i} />) } return row })()} </tbody>
如果您选择将其转换为内部 的 return() 强> 的 的 给予 强> 方法,最简单的选择就是使用 的 地图() 强> 方法。使用map()函数将数组映射到JSX语法,如下所示( 使用ES6语法 )。
的 内部父组件 强> :
<tbody> { objectArray.map((object, index) => <ObjectRow key={index} object={object}>) } </tbody>
请注意 key 属性已添加到您的子组件中。如果未提供键属性,则可以在控制台上看到以下警告。
警告:数组或迭代器中的每个子节点都应该有 一个独特的“关键”道具。
现在在 的 ObjectRow 强> 组件,您可以从它的属性访问该对象。
的 在ObjectRow组件内部 强>
const { object } = this.props
要么
const object = this.props.object
这应该会提取您从父组件传递给变量的对象 object 在 的 ObjectRow 强> 零件。现在,您可以根据您的目的吐出该对象中的值。
object
参考文献:
Javascript中的map()方法
ECMA Script 6或ES6
不确定这是否适合您的情况,但经常 地图 是一个很好的答案。
如果这是你的代码与for循环:
<tbody> for (var i=0; i < objects.length; i++) { <ObjectRow obj={objects[i]} key={i}> } </tbody>
你可以像这样写它 地图 :
<tbody> {objects.map(function(object, i){ return <ObjectRow obj={object} key={i} />; })} </tbody>
ES6语法:
<tbody> {objects.map((object, i) => <ObjectRow obj={object} key={i} />)} </tbody>
要循环多次并返回,你可以借助它来实现它 from 和 map :
from
map
<tbody> { Array.from(Array(i)).map(() => <ObjectRow />) } </tbody>
哪里 i = number of times
i = number of times
我喜欢它
<tbody> { numrows ? ( numrows.map(obj => { return <ObjectRow /> }) ) : null} </tbody>
简单地使用 的 地图 强> 排列 ES6语法的方法:
<tbody> {items.map(item => <ObjectRow key={item.id} name={item.name} />)} </tbody>
别忘了 key 属性。
如果你什么都没有 .map() 您可以使用 Array.from() 随着 mapFn 重复元素:
.map()
Array.from()
mapFn
<tbody> {Array.from({ length: 5 }, (v, k) => <ObjectRow key={k} />)} </tbody>
您当然可以使用.map解决,如其他答案所示。如果你已经使用了babel,你可以考虑使用 JSX控制语句 它们需要一些设置,但我认为它在可读性方面是值得的(特别是对于非反应开发人员)。 如果你使用短绒,那也是 eslint-插件 - JSX控制语句
我知道这是一个旧线程,但您可能想要结账 http://wix.github.io/react-templates/ ,它允许你在反应中使用jsx风格的模板,带有一些指令(例如rt-repeat)。
您的示例,如果您使用react-templates,将是:
<tbody> <ObjectRow rt-repeat="obj in objects"/> </tbody>
这是一个简单的解决方案。
var Object_rows=[]; for (var i=0; i < numrows; i++) { Object_rows.push(<ObjectRow/>) } <tbody> {Object_rows} </tbody>
不需要映射和复杂的代码。您只需要将行推送到数组并返回值来呈现它。
可以想象它就像你只是调用JavaScript函数一样。你不能使用 for 循环,函数调用的参数将去:
for
return tbody( for (var i = 0; i < numrows; i++) { ObjectRow() } )
看看这个功能如何 tbody 正在通过一个 for 循环作为参数,当然这是一个语法错误。
tbody
但是你可以创建一个数组,然后将其作为参数传递:
var rows = []; for (var i = 0; i < numrows; i++) { rows.push(ObjectRow()); } return tbody(rows);
使用JSX时,您可以使用基本相同的结构:
var rows = []; for (var i = 0; i < numrows; i++) { // note: we add a key prop here to allow react to uniquely identify each // element in this array. see: https://reactjs.org/docs/lists-and-keys.html rows.push(<ObjectRow key={i} />); } return <tbody>{rows}</tbody>;
顺便说一句,我的JavaScript示例几乎就是JSX转换的例子。玩弄 Babel REPL 了解JSX的工作原理。
以下是React doc的示例: https://facebook.github.io/react/docs/jsx-in-depth.html#javascript-expressions-as-children
function Item(props) { return <li>{props.message}</li>; } function TodoList() { const todos = ['finish doc', 'submit pr', 'nag dan to review']; return ( <ul> {todos.map((message) => <Item key={message} message={message} />)} </ul> ); }
作为你的情况,我建议像这样写:
function render() { return ( <tbody> {numrows.map((roe, index) => <ObjectRow key={index} />)} </tbody> ); }
请注意Key非常重要,因为React使用Key来区分数组中的数据。
我用这个:
gridItems = this.state.applications.map(app => <ApplicationItem key={app.Id} app={app } /> );
PD:永远不会忘记密钥,否则你会收到很多警告!
您的JSX代码将编译为纯JavaScript代码,任何标记都将替换为 ReactElement 对象。在JavaScript中,您无法多次调用函数来收集返回的变量。
ReactElement
它是非法的,唯一的方法是使用数组来存储返回变量的函数。
或者你可以使用 Array.prototype.map 这是可用的 自JavaScript ES5起 处理这种情况。
Array.prototype.map
也许我们可以编写其他编译器来重新创建一个新的JSX语法来实现重复函数 角的 ng-repeat 。
ng-repeat
让我们说你们州里有一系列物品:
[{name: "item1", id: 1}, {name: "item2", id: 2}, {name: "item3", id: 3}] <tbody> {this.state.items.map((item) => { <ObjectRow key={item.id} name={item.name} /> })} </tbody>
你可以这样做:
let foo = [1,undefined,3] { foo.map(e => !!e ? <Object /> : null )}