以下问题与 React Context 文档中的以下部分有关:
免责声明:对以下所有背景信息深表歉意。它提供了背景信息,希望对未来的访问者有所帮助。
我们所知道的
- 链接 1
- (默认)上下文值设置为
themes.dark(包含两个属性的对象:foreground和background) - 默认值仅在组件树中没有
Providers上方时才使用Consumer - 在这种情况下,
Provider顶级组件中有一个礼物 (App) - this
Provider(App),将它自己state作为上下文值传递下去 - 将
Provider结构和类型提供的值保持为默认上下文值是明智的(避免Consumers混淆) - 因此,
state在顶级组件 (App) 中保存了一个与默认上下文值相同格式的对象:themes.light - 上面的结论:当 a
Consumer读取上下文时,它读取App的状态 - 换句话说,我们在这里使用上下文在组件树的深处传递父(
App)state,而不必将其传递到中间的每个组件 - 当顶级组件 (
App) 中的状态发生变化时,它会重新渲染并为状态提供一个新值给Consumer - 这样,通过上下文
Consumer读取父级的state - ...
- 继续前进,我们在链接 1 中看到设置
state(toggleTheme)的函数作为正常情况沿组件树向下传递prop - 因此,在链接 1 中,
context只包含一个读取的对象state - 我们能够设定的状态
Consumer通过将setState功能作为一个正常的prop从Provider的孩子,向下通过所有的中间组件,以及向Consumer state在顶级组件 (App) 中设置 the会导致自身重新渲染,从而导致 重新渲染Provider,然后将新Appstate值向下传递给它的Consumervia上下文- 因此,
Consumer总是App通过上下文知道的状态 - 总之,流程是:
- 家长
state提供的上下文值以孩子Consumer(一个或多个) - 家长
state是孩子的一些更新 - 父级重新渲染
Provider看到上下文值(App'sstate) 已更改,并Consumer使用新值重新呈现其所有s
- 家长
- (默认)上下文值设置为
- 链接 2
- 在链接 2 中,我们通过在上下文中传递函数来设置
state,ConsumersetState - 这与链接 1 不同,链接 1 中我们依靠法线
prop来设置state
- 在链接 2 中,我们通过在上下文中传递函数来设置
问题
我们从文档中知道:
每个 Context 对象都带有一个 Provider React 组件,该组件允许使用组件订阅上下文更改......
每当 Provider 的 value 属性发生变化时,所有作为 Provider 后代的消费者都会重新渲染。
- 假设我们使用普通变量 in
App作为上下文值。我们从上面的引用中知道,改变它会导致Provider重新渲染。那么,为什么我们懒得使用state作为背景值?与仅在 中使用任何正常变量相比,这样做有什么好处App? - 上述两种方法都允许我们更新
state. 为什么链接 2 包含要state在state自身内部更新的功能?我们能否将它作为一个单独的setState函数传递给具有两个属性的对象中的Consumervia上下文(一个是state,另一个是要更新的独立函数state)?