在另一StackOverflow上后,谢霆锋让我了解到,一个Context.Provider重新呈现其子Context.Consumer组件时的上下文值的Provider规定变化。
官方文件进一步证实了这一点:
每当 Provider 的 value 属性发生变化时,所有作为 Provider 后代的消费者都会重新渲染。
Nicholas 还帮助我理解了 a Providerwill 知道上下文值是否已更改的唯一方法,是它的封闭组件是否重新呈现。
总之:
ProvidersConsumers每当上下文值更改时更新它- 这只会在
Provider重新渲染周围的封闭函数时发生 Provider无论如何,这会导致及其所有后代重新渲染
因此,上面(1)中的特征似乎是多余的。如果Provider仅Consumers在其封闭组件重新渲染时才更新,并且仅在父组件重新渲染时发现上下文值更新,则不需要具有允许在上下文值更改时Provider更新的功能。Consumers
我在这里错过了什么?
编辑
尼古拉斯还在评论中说:
由于与通过上下文提供的value无关的事情,应用程序可以(可以想象)重新渲染。如果发生这种情况,您不希望消费者重新渲染。为此,您需要之前的值和之后的值才能通过 === 检查。如果您提供一个对象,这意味着您不能在 App 的 render 方法中创建一个全新的对象,否则您最终会不必要地重新渲染消费者。
但是,我的印象是,当父级重新渲染时,其所有子级也将重新渲染。因此,===上面提到的检查无济于事,即孩子们无论如何都会重新渲染。