是否在React中从相同上下文派生的Provider实例之间共享上下文值?

时间:2019-11-16 18:34:55

标签: reactjs react-hooks react-context

我有一个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>

其中valueOnevalueTwo可能会发生变化

// 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拥有自己的“私有”值的正确方法是什么?

如果不是这种情况,那么这是如何工作的,因为所有提供程序都是从相同的React.useContext()调用派生的?

1 个答案:

答案 0 :(得分:1)

即使createContext仅被调用一次,React每次渲染上下文提供者都会创建这些上下文的实例。当某些人调用useContext时,React会在渲染树中向上查找给定 type 的最近Provider,并从该上下文的 instance 获取该值。

Example