上下文允许您将值沿着组件树传递,而无需通过父子关系。
假设您想在位于组件层次结构深处三层的组件中使用访问令牌:
const [authoStore, setAuthStore] = createStore({ /* Contents */ });
<ParentA>
<ParentB>
<Child />
</ParentB>
</ParentA>
您可以将商店从 ParentS 传递到 Parent 到 Child:
<ParentA store={authStore}>
<ParentB store={authStore}>
<Child store={authStore} />
</ParentB>
</ParentA>
或者您可以创建一个上下文并将存储作为其值传递,以便子组件可以通过上下文 API 直接访问它。
const AuthContext = createContext(defaultValue);
<AuthContext.Provider value={authStore}>
<ParentA>
<ParentB>
<Child />
</ParentB>
</ParentA>
</AuthContext>
在子组件内部:
const Child = () => {
const authStore = useContext(AuthContext);
// Snipped
}
现在,如果我们回到最初的问题,使用信号或存储是无关紧要的,因为只要内部组件可以访问身份验证令牌,您就可以使用存储、信号、本地存储甚至普通的 Javascript 对象。但是 Context API 提供了一种在组件之间共享值的简单方法,无论它们在组件层次结构中的位置有多深。
还有其他好处,例如,您可以通过提供不同的值来覆盖组件树不同级别上的值。
Here ChildA
将收到该值red
while ChildB
会收到blue
:
<ThemeContext.Provider value='red'>
<ChildA />
<ThemeContext.Provider value='blue'>
<ChildB />
</ThemeContext.Provider>
</ThemeContext.Provider>
您可以通过上下文传递任何类型的值,包括信号和存储。