如何渲染重复元素?
我写了一些代码来渲染ReactJS中的重复元素,但我讨厌它有多丑。
render: function(){
var titles = this.props.titles.map(function(title) {
return <th>{title}</th>;
});
var rows = this.props.rows.map(function(row) {
var cells = [];
for (var i in row) {
cells.push(<td>{row[i]}</td>);
}
return <tr>{cells}</tr>;
});
return (
<table className="MyClassName">
<thead>
<tr>{titles}</tr>
</thead>
<tbody>{rows}</tbody>
</table>
);
}
有没有更好的方法来实现这一目标?
(我想嵌入for
模板代码,或者一些类似的方法内循环。)
您可以将表达式放在大括号内。 请注意,在编译的JavaScript中,为什么在JSX语法中永远无法使用for
循环; JSX相当于函数调用和加糖函数参数。 只允许表达式。
(另外:记得要将key
属性添加到循环内部呈现的组件中。)
JSX + ES2015 :
render() {
return (
<table className="MyClassName">
<thead>
<tr>
{this.props.titles.map(title =>
<th key={title}>{title}</th>
)}
</tr>
</thead>
<tbody>
{this.props.rows.map((row, i) =>
<tr key={i}>
{row.map((col, j) =>
<td key={j}>{col}</td>
)}
</tr>
)}
</tbody>
</table>
);
}
JavaScript :
render: function() {
return (
React.DOM.table({className: "MyClassName"},
React.DOM.thead(null,
React.DOM.tr(null,
this.props.titles.map(function(title) {
return React.DOM.th({key: title}, title);
})
)
),
React.DOM.tbody(null,
this.props.rows.map(function(row, i) {
return (
React.DOM.tr({key: i},
row.map(function(col, j) {
return React.DOM.td({key: j}, col);
})
)
);
})
)
)
);
}
为了扩展Ross Allen的答案,这里使用ES6箭头语法稍微清晰一些。
{this.props.titles.map(title =>
<th key={title}>{title}</th>
)}
它的优点是JSX部分是孤立的(不return
或;
),这样可以更容易地将它放在一个循环中。
本着函数式编程的精神,让我们通过使用抽象来简化组件的工作。
// converts components into mappable functions
var mappable = function(component){
return function(x, i){
return component({key: i}, x);
}
}
// maps on 2-dimensional arrays
var map2d = function(m1, m2, xss){
return xss.map(function(xs, i, arr){
return m1(xs.map(m2), i, arr);
});
}
var td = mappable(React.DOM.td);
var tr = mappable(React.DOM.tr);
var th = mappable(React.DOM.th);
现在我们可以像这样定义我们的渲染:
render: function(){
return (
<table>
<thead>{this.props.titles.map(th)}</thead>
<tbody>{map2d(tr, td, this.props.rows)}</tbody>
</table>
);
}
jsbin
我们的map2d的另一种选择是咖喱地图功能,但人们往往会避免使用咖喱。
链接地址: http://www.djcxy.com/p/52047.html