reactjs - Provider 实例之间是否共享从 React 中的相同上下文派生的上下文值?
问题描述
我有一个 Provider 组件,我通过钩子导出其值。
我所描述的简单实现是这样的:
// SomeProvider.jsx
const SomeContext = React.createContext(null);
function SomeProvider(props) {
const [state, setState] = useState(null)
useEffect(() => {
//some logic
setState(newValue)
}, [props.someValue])
return <SomeContext.Provider value={state} {...props} />;
}
const useSome = () => React.useContext(SomeContext);
export { SomeProvider, useSome };
现在,如果我想在多个地方使用这个上下文提供程序怎么办?例如
// App.jsx
<SomeProvider someValue={valueOne}>
<SomeComponent />
</SomeProvider>
<SomeProvider someValue={valueTwo}>
<SomeOtherComponent />
</SomeProvider>
在哪里valueOne
以及valueTwo
可能会发生变化
// SomeComponent.jsx
import { useSome } from 'SomeProvider';
function SomeComponent() {
const someValue = useSome();
return ....
}
// SomeOtherComponent.jsx
import { useSome } from 'SomeProvider';
function SomeOtherComponent () {
const someValue = useSome();
return ....
}
这种方法会导致两个SomeProvider
实例共享一个共同的值,从而搞砸事情吗?
如果是这种情况,那么最终使每个人SomeProvider
都有自己的“私人”价值的正确方法是什么?
如果不是这种情况,那么这是如何工作的,因为所有 Providers 都是从同一个React.useContext()
调用派生的?
解决方案
即使createContext
只调用一次,React 也会在每次渲染上下文 Provider 时创建这些上下文的实例。当调用 时useContext
,React 将向上渲染树以查找给定类型的最近 Provider 并从该上下文的实例中获取该值。
推荐阅读
- git - Gitlab + Jira 集成与多个分支的合并/拉取请求的自动问题转换
- css - 如何在复杂的弹性盒中不使用绝对
- automated-tests - 具有大量控件的页面的 Specflow
- c++ - C++ 98 中的部分模板专业化?
- php - 我收到错误消息:“无法加载请求的文件”。如何解决问题?
- python - 有没有办法在 excel 和 power point 之间自动执行复制粘贴操作?
- google-apps-script - 如何解决共享 Google Apps 脚本库的“此应用被阻止”错误?
- java - 当状态码为 400 时,volley 返回空响应
- javascript - Echarts 未完全显示在 div 上。如何调整图表大小以适应 div?
- reactjs - 很难将 PayPal 与我的电子商务应用程序集成