Javascript 反应:消费者环境的变化
以下问题与React上下文文档中的以下部分有关: 免责声明:对以下所有背景信息表示歉意。它提供了上下文,希望对未来的访问者有所帮助Javascript 反应:消费者环境的变化,javascript,reactjs,Javascript,Reactjs,以下问题与React上下文文档中的以下部分有关: 免责声明:对以下所有背景信息表示歉意。它提供了上下文,希望对未来的访问者有所帮助 我们所知道的 链接1 (默认)上下文值设置为themes.dark(包含两个属性的对象:前台和后台) 只有在组件树中的使用者上方没有提供者时,才会使用默认值 在这种情况下,顶级组件(App)中存在一个提供者 此提供程序(应用程序),将其自身的状态作为上下文值传递 让提供者提供的值在结构和类型上与默认上下文值相同是明智的(避免消费者混淆) 因此,顶级组件(A
我们所知道的
- 链接1
- (默认)上下文值设置为
(包含两个属性的对象:themes.dark
和前台
)后台
- 只有在组件树中的
上方没有使用者
时,才会使用默认值提供者
- 在这种情况下,顶级组件(
)中存在一个App
提供者
- 此
(提供程序
),将其自身的应用程序
作为上下文值传递状态
- 让
提供者提供的值在结构和类型上与默认上下文值相同是明智的(避免
混淆)消费者
- 因此,顶级组件(
)中的App
持有与默认上下文值格式相同的对象:state
themes.light
- 从上面得出的结论:当
读取上下文时,它会读取消费者
的状态应用程序
- 换句话说,我们在这里使用上下文在组件树的深处传递父级(
)App
,而不必通过中间的每个组件state
- 当顶级组件(
)中的状态发生更改时,它将重新呈现,并向App
消费者提供一个新的状态值
- 通过这种方式,
通过上下文读取父级的消费者
状态
- 继续,我们在链接1中看到,设置
状态的函数(
)作为普通切换主题
属性
- 因此,在链接1中,
仅包含读取上下文
状态
- 我们可以通过将
函数作为正常的设置状态
从道具
的子级传递到提供者
中,通过所有中间组件,然后传递到消费者
消费者
- 在顶级组件(
)中设置应用程序
),会导致自身的重新呈现,从而导致状态
的重新呈现,然后提供者通过上下文将新的提供者
状态值向下传递给其应用程序
消费者
- 因此,
消费者总是通过上下文知道
应用程序的状态
- 总之,流程是:
- 家长的
作为上下文值提供给孩子状态
(s)消费者
- 父项的
由某个子项更新状态
- 父级重新渲染
看到上下文值(提供者
应用程序的
)已更改,并使用新值重新呈现其所有状态
消费者
- (默认)上下文值设置为
- 在链接2中,我们通过在上下文中传递
函数,在setState
中设置Consumer
state
- 这与链接1不同,在链接1中,我们依靠正常的
来设置prop
状态
问题 我们从中了解到: 每个上下文对象都带有一个提供程序React组件,该组件允许 正在使用组件以订阅上下文更改 作为提供者后代的所有使用者都将重新呈现 每当提供者的价值属性发生变化时。
App
中的正常变量作为上下文值。从上面的引文中我们知道,更改它会导致提供程序
重新呈现。那么,我们为什么要麻烦使用状态
作为上下文值呢?与仅在应用程序中使用任何正态变量相比,这有什么好处
状态
。为什么链接2在状态
本身中包含更新状态的功能?我们是否可以将其作为一个单独的setState
函数,通过一个具有两个属性(一个是状态
,另一个是更新状态
)的对象中的上下文传递给使用者
=
。这是超快速的,并且与React对不可变数据的偏好配合得很好,但是当使用对象作为值时,您需要小心不要创建新对象
class App extends Component {
state = {
data: {
hello: 'world',
}
}
updateData() {
// some function for updating the state
}
render() {
return (
<MyContext.Provider value={{
data: this.state.data,
updateData: this.updateData
}} />
)
}
}