在我的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,但是有6次here)。我本以为控制台中的here只有2倍之多。为什么叫了6次?也许Immutable.js中的序列的工作方式与我预期的不同。
更新:
我创建了一个非常简单的应用程序,使用create-react-app演示了被发现在吉萨布 (克隆-> npm run start ->浏览到本地主机:3000 ->监视控制台)的问题。奇怪的是,我不能在科普登上重现这个问题。
发布于 2018-02-14 17:36:17
我相信这是因为Seq很懒。这意味着,在迭代.map() Seq 之前,不会调用传递给的函数。
我认为会发生这样的事。当你打电话的时候
x.entrySeq.map(...)这将创建一个新的Seq。然后,您的呈现函数返回这个Seq以作出反应。到目前为止,console.log("here")还没有被调用。
现在react正在将这个Seq存储在它的组件树中。每当function遍历树的这一部分(不仅在呈现时发生),它就会迭代您的Seq,从而调用传递给.map()的函数。
如果您希望避免每次响应决定遍历树的这一部分时进行这种恢复,则需要缓存Seq的输出。最简单的方法是在.toArray()之后使用.map(...)。在这种情况下,Seq将立即迭代一次,然后存储在一个数组中,然后给出一个数组以作出反应。
https://stackoverflow.com/questions/48772389
复制相似问题