我写了一些代码来呈现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
循环。)
为了扩展Ross Allen的答案,这里有一个使用ES6 arrow语法的稍微简洁的变体。
{this.props.titles.map(title =>
<th key={title}>{title}</th>
)}
它的优点是JSX部分是隔离的(无返回
或;
),因此更容易在其周围放置循环。
由于Array(3)
将创建一个不可编辑的数组,因此必须填充该数组以允许使用map
Array方法。“转换”的一种方法是在数组括号内对其进行分解,这将“强制”数组填充未定义的值,与
数组(N)相同。填充(未定义)
<table>
{ [...Array(3)].map((_, index) => <tr key={index}/>) }
</table>
<table>
{ Array(3).fill(<tr/>) }
</table>
⚠️上面例子的问题是缺少
key
prop,这是必须的。(不建议使用迭代器的index
作为key
)
const tableSize = [3,4]
const Table = (
<table>
<tbody>
{ [...Array(tableSize[0])].map((tr, trIdx) =>
<tr key={trIdx}>
{ [...Array(tableSize[1])].map((a, tdIdx, arr) =>
<td key={trIdx + tdIdx}>
{arr.length * trIdx + tdIdx + 1}
</td>
)}
</tr>
)}
</tbody>
</table>
);
ReactDOM.render(Table, document.querySelector('main'))
td{ border:1px solid silver; padding:1em; }
<script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
<main></main>
您可以将表达式放在大括号内。请注意,在编译的JavaScript中,为什么在JSX语法中永远不可能有for
循环;JSX相当于函数调用和加糖函数参数。只允许使用表达式。
(另外:请记住将键
属性添加到循环内渲染的组件。)
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);
})
)
);
})
)
)
);
}
问题内容: 我已经写了一些代码来渲染ReactJS中的重复元素,但是我讨厌它是如此丑陋。 有没有更好的方法来实现这一目标? (我想在模板代码或类似方法中嵌入循环。) 问题答案: 您可以将表达式放在大括号内。请注意,在已编译的JavaScript中,为什么在JSX语法中永远不可能发生循环;JSX相当于函数调用和加糖的函数参数。仅允许使用表达式。 (此外:请记住将属性添加到在循环内渲染的组件。) JS
我无法呈现一个selectOneMenu,但只能禁用该项目 例如,这是可行的: 而这个不是: 有什么建议吗 谢谢
问题内容: 如何获得元素的渲染高度? 假设您的元素内部包含一些内容。内部的内容将扩大的高度。当您没有明确设置高度时,如何获得“渲染的”高度。显然,我尝试过: 有这样做的技巧吗?如果有帮助,我正在使用jQuery。 问题答案: 应该是 jQuery。这将以数字形式检索包装集中的第一个项目的高度。 尝试使用 仅当您首先将属性设置为有效。不是很有用!
因此,在去年与react合作之后,我设法理解了它的功能和注意事项,以及如何避免不必要的渲染。 昨天我在玩一些代码,遇到了一个以前没有看到的问题,有点困惑。 在上面的代码中,我添加了一个简单的计数器,每次单击都会设置一个新的状态,这会导致重新渲染,在屏幕上显示“Count:1”,并在dev工具中显示一个“counter render”日志,就像我预期的那样。 奇怪的部分来自渲染变量,我用数字0启动(
您好,我有以下代码可以有条件地在我的页面中呈现组件: 它得到答案并呈现组件,但为了在我的页面上看到它,我需要刷新页面。我如何解决这个问题?有什么建议吗?
主要内容:实例,实例,实例,实例元素是构成 React 应用的最小单位,它用于描述屏幕上输出的内容。 与浏览器的 DOM 元素不同,React 当中的元素事实上是普通的对象,React DOM 可以确保 浏览器 DOM 的数据内容与 React 元素保持一致。 将元素渲染到 DOM 中 首先我们在一个 HTML 页面中添加一个 id="example" 的 <div>: 在此 div 中的所有内容都将由 React DOM 来管