在我的React应用程序的一个组件中,我有以下代码:
render() {
console.log("render");
const x = Immutable.Map({a: 1, b: 2});
return (
<div>
{x.entrySeq().map(() => {
console.log("here");
return (<div></div>)
})}
</div>
)
}
奇怪的是map
函数中的循环执行了6次(我在控制台上得到一个render
,但是here
的6次。我本来期望在控制台中只有here
的2倍。为什么叫6次?也许Immutable.js中的序列的工作方式与我预期的不同。
我使用create-react-app
创建了一个非常简单的应用,以演示可以be found on Github(克隆 - &gt; npm run start
- >浏览到localhost:3000 - &gt;监视控制台的问题。奇怪的是,我无法在Codepen上重现这个问题。
答案 0 :(得分:1)
我相信这是因为Seq
是懒惰的。
这意味着,在.map()
重复之前,不会调用传递给Seq
的函数。
这就是我认为发生的事情。当你打电话
x.entrySeq.map(...)
这会创建一个新的Seq
。
然后,您的渲染函数会返回此Seq
以作出反应。
此时,console.log("here")
仍然没有被调用。
现在,react会将此Seq
存储在其组件树中。
每次反应遍历树的这一部分(这不仅在渲染时发生),它将遍历您的Seq
,而.map()
将调用您传递给Seq
的函数。
如果你想在每次反应决定遍历树的这一部分时避免这种重新计算,你需要缓存.toArray()
的输出。最简单的方法是在.map(...)
之后加上Seq
。在这里,model.add(Dense(units=units,activation='softmax'))
将立即迭代一次,然后存储在一个数组中,然后你给出反应。