React | 当 .forEach 创建“超出最大调用堆栈大小”错误时,为什么 .map 可以工作
2015-07-06
762
刚接触 React,正在尝试使用它。看不出使用 forEach 时出现错误而使用 map 时没有错误的任何明显原因:
注意:我将其与 ampersand(基于骨干的框架)一起使用 Repos = 30 个对象,每个对象有 3 个属性
export default React.createClass({
mixins: [ampersandReactMixin],
displayName: 'ReposPage',
render() {
const {repos} = this.props
return (
<div>
{
repos.forEach((repo) => {
return (
<div key={repo.id}>
<span>goodbye world</span>
</div>
)
})
}
</div>
)
}
});
输出如下:
Warning: Any use of a keyed object should be wrapped in React.addons.createFragment(object) before being passed as a child.
warning.js:48 Warning: Any use of a keyed object should be wrapped in React.addons.createFragment(object) before being passed as a child.
warning.js:48 Warning: Any use of a keyed object should be wrapped in React.addons.createFragment(object) before being passed as a child.
traverseAllChildren.js:67
Uncaught RangeError: Maximum call stack size exceeded
vs
export default React.createClass({
mixins: [ampersandReactMixin],
displayName: 'ReposPage',
render() {
const {repos} = this.props
return (
<div>
{
repos.map((repo) => {
return (
<div key={repo.id}>
<span>goodbye world</span>
</div>
)
})
}
</div>
)
}
});
运行正常。
我认为这与 map 通过以下方式返回新对象有关...这到底有什么关系?
2个回答
forEach
总是返回未定义。
因此,您的第一个例子本质上是
<div>
{ undefined }
</div>
React 似乎在渲染未定义时出现问题。
Crob
2015-07-06
查看
forEach
上的文档。函数
forEach
将始终返回
undefined
。
repos.forEach((repo) => {
return (/* ... */);
})
这将导致以下代码
<div>
{ undefined }
</div>
正如错误所述,
undefined
不是有效的
DOMElement
。由于某种原因,此错误触发了堆栈溢出。
只需使用
map
,它实际上将返回一组新对象(基于您在函数内部返回的内容)。
riptidebyte
2015-07-06