【发布时间】:2019-03-26 19:02:42
【问题描述】:
以下问题与 React Context 文档中的以下部分有关:
免责声明:对以下所有背景信息表示歉意。它提供了上下文,并有望对未来的访问者有所帮助。
我们所知道的
- 链接 1
- (默认)上下文值设置为
themes.dark(包含两个属性的对象:foreground和background) - 只有在组件树中
Consumer上方没有Providers时才会使用默认值 - 在这种情况下,顶级组件中存在
Provider(App) - 这个
Provider(App) 将自己的state作为上下文值 - 明智的做法是让
Provider提供的值在结构和类型上与默认的上下文值相同(避免Consumers混淆) - 因此,顶级组件 (
App) 中的state拥有与默认上下文值格式相同的对象:themes.light - 以上结论:当
Consumer读取上下文时,它读取App的状态 - 换句话说,我们在这里使用 context 将父级 (
App)state传递到组件树的深处,而无需将其传递给中间的每个组件 - 当顶级组件 (
App) 中的状态发生变化时,它会重新渲染,并为Consumer提供新的状态值 - 这样,
Consumer通过 context 读取父级的state - ...
- 继续前进,我们在链接 1 中看到 set
state(toggleTheme) 的函数作为正常的prop向下传递组件树 - 因此,在链接 1 中,
context仅 包含 读取state的对象 - 我们能够设置
Consumer中的状态,方法是将setState函数作为普通prop从Provider的子级传递到所有中间组件,并进入Consumer - 在顶级组件 (
App) 中设置state会导致重新渲染自身,从而导致重新渲染Provider,然后传递新的Appstate的值通过 context 降至其Consumer - 因此,
Consumer始终通过 context 知道App的状态 - 总之,流程是:
- 父母的
state作为上下文值提供给孩子Consumer(s) - 家长的
state已被某个孩子更新 - 父级重新渲染
-
Provider看到 上下文值(App的state)已更改,并使用新值重新渲染其所有Consumers
- 父母的
- (默认)上下文值设置为
- 链接 2
- 在链接 2 中,我们设置
Consumer中的state,方法是在上下文中传递setState函数 - 这与链接 1 不同,在链接 1 中,我们依靠普通的
prop来设置state
- 在链接 2 中,我们设置
问题
我们从the docs 得知:
每个 Context 对象都带有一个 Provider React 组件,它允许 使用组件来订阅上下文更改....
所有作为 Provider 后代的消费者都将重新渲染 每当 Provider 的 value 属性发生变化时。
- 假设我们使用
App中的普通变量作为上下文值。从上面的引用中我们知道,更改它会导致Provider重新渲染。那么,为什么我们还要麻烦使用state作为 context 值呢?与在App中使用任何普通变量相比,这样做有什么好处? - 上述两种方法都允许我们更新
state。为什么链接 2 包含更新statewithinstate本身的功能?我们能不能把它作为一个单独的setState函数,通过 context 在一个具有两个属性的对象中传递给Consumer(一个是state,另一个是独立的更新state)的函数?
【问题讨论】:
标签: javascript reactjs