Provider 实例之间共享的上下文值是否源自 React 中的相同上下文?

Dim*_*nis 3 reactjs react-context react-hooks

我有一个 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 };
Run Code Online (Sandbox Code Playgroud)

现在,如果我想在多个地方使用这个上下文提供者怎么办?例如

// App.jsx
<SomeProvider someValue={valueOne}>
  <SomeComponent />
</SomeProvider>
<SomeProvider someValue={valueTwo}>
  <SomeOtherComponent />
</SomeProvider>
Run Code Online (Sandbox Code Playgroud)

哪里valueOnevalueTwo可能会发生变化

// SomeComponent.jsx
import { useSome } from 'SomeProvider';

function SomeComponent() {
  const someValue = useSome();

  return ....
}
Run Code Online (Sandbox Code Playgroud)
// SomeOtherComponent.jsx
import { useSome } from 'SomeProvider';

function SomeOtherComponent () {
  const someValue = useSome();

  return ....
}
Run Code Online (Sandbox Code Playgroud)

这种方法会导致两个SomeProvider实例共享一个共同的值,从而把事情搞砸吗?

如果是这样的话,最终每个人SomeProvider都有自己的“私人”价值的正确方法是什么?

如果不是这种情况,这是如何工作的,因为所有 Providers 都来自同一个React.useContext()调用?

azi*_*ium 6

即使createContext只被调用一次,React 也会在每次渲染上下文提供者时创建这些上下文的实例。当有东西调用时useContext,React 会沿着渲染树向上查找给定类型的最近的 Provider并从该上下文的实例中获取该值。

例子

  • 这是正确的。需要特别说明的是,“Context.Provider”组件上的“value”属性是可选的。您已经使用它来实现一种修改传递给“createContext”的默认值的方法——但您刚才所说的是完全正确的。 (2认同)