Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么一个容器的所有PureComponent子级都在更新,而只有一个子级';s状态在容器中被修改';什么是州树?_Javascript_Reactjs_Redux - Fatal编程技术网

Javascript 为什么一个容器的所有PureComponent子级都在更新,而只有一个子级';s状态在容器中被修改';什么是州树?

Javascript 为什么一个容器的所有PureComponent子级都在更新,而只有一个子级';s状态在容器中被修改';什么是州树?,javascript,reactjs,redux,Javascript,Reactjs,Redux,学习反应和重复。我正在使用Redux示例,目前正在查看示例(不认为可以设置沙箱或其他东西)。在此设置中有一个容器组件(TodoList)及其子组件(Todo) 我将Todo从功能组件修改为PureComponent类,这样,如果所有prop引用都相同,shouldComponentUpdate()将返回false,因此组件不应更新(但它们仍将重新渲染??) 当子对象使用componentDidUpdate()方法更新时将代码添加到日志中,以及在重新呈现时将代码添加到日志中,这表明每次向容器添加新

学习反应和重复。我正在使用Redux示例,目前正在查看示例(不认为可以设置沙箱或其他东西)。在此设置中有一个容器组件(TodoList)及其子组件(Todo)

我将Todo从功能组件修改为PureComponent类,这样,如果所有prop引用都相同,shouldComponentUpdate()将返回false,因此组件不应更新(但它们仍将重新渲染??)

当子对象使用componentDidUpdate()方法更新时将代码添加到日志中,以及在重新呈现时将代码添加到日志中,这表明每次向容器添加新Todo时,所有元素都会更新并重新播放——即使是纯组件——在这种情况下,对每个子元素的新旧道具进行肤浅比较时,对于新的或更新的子元素,应该返回false


作为Redux创建的一个例子,我怀疑他们没有正确地更新存储(不是以不变的方式),因为这是他们概念的要点,所以我相信我没有完全理解->有人请帮助…

PureComponent并不意味着它不会更新,这只是意味着React将通过实现shouldComponentUpdate和浅层的prop和state比较来为您处理props和state的比较。

因为
正在向每个子级传递一个新的回调函数引用:

将默认类导出到列表扩展组件{
render(){
返回(
    {this.props.todos.map((todo,index)=> this.props.onTodoClick(index)}/> )}
); } }

这将始终导致子级重新渲染,即使它试图根据道具比较优化渲染。

我理解,我本应该更清楚,但是,除了更新的或新的子级之外,浅层比较应该返回真值-我没有实现控制这一点的还原器(状态更新),redux开发人员做到了,看这个,干杯,这个链接有助于我理解PureComponents是如何实现shouldComponentUpdate()的,但是我认为它对这种情况没有帮助。在todo演示中,TodoList获取一个字符串数组。数组的引用会随着新的todo(不变性)而改变,所以TodoList RERERERENDERS,好的。这将导致对子级进行更新检查,唯一给定的prop是字符串(JS中的原语),而react shallow comparison直接比较这些值的新旧值,所以如果未更改,是否应返回false?我认为这是正确的,但它仍然不符合应用程序的行为,因此…当您切换todo时,您正在使用map创建一个新的todo数组,这就是导致重新渲染的原因,您应该使用React.memo来防止todo更新,请看这个:React.memo和功能组件正是我需要的,非常感谢您帮助我理解,但仍然不知道为什么PureComponent不能工作。我知道map函数将提供一个新的数组和新的引用,TodoList将重新渲染,并诱导子元素的更新,但子元素只是给定的字符串,如果它们与以前的字符串相同,那么应该返回false对吗?我会读更多的东西,也许有东西会点击……因为它每次都会生成新的函数对象,没有想到这一点,为答案欢呼。当然。有关更多详细信息,请参阅我在上的博文。