你能解释一下为什么如果我不使用Context.Provider包装组件,useContext()还是能够正常工作吗?我只是将“createContext(someValues)”的结果与预定义的值导出,并在组件中调用useContext(exportedContext),它就可以工作了。每个教程都告诉我要包装组件,React有什么变化吗?
你能解释一下为什么如果我不使用Context.Provider包装组件,useContext()还是能够正常工作吗?我只是将“createContext(someValues)”的结果与预定义的值导出,并在组件中调用useContext(exportedContext),它就可以工作了。每个教程都告诉我要包装组件,React有什么变化吗?
所有的消费者组件只要是依赖于某个提供者组件,就会在该提供者组件的 value 属性发生变化时重新渲染。换言之,如果你不使用 Context.Provider
来包裹你的组件,那么当 createContext(someValues)
中的 someValues
发生变化时,这些组件就不会被重新渲染。你只能在第一次渲染时得到设置的初始值。
示例可以在这里查看。
React.Context
总是以这种方式工作。
如果一个组件没有被包装在 Context.Provider
中,它将会接收到在创建上下文时设置的默认值。
Provider 的工作是覆盖默认值,从本质上为 React 组件树提供依赖注入机制。
这里有来自 React 团队的好答案:https://github.com/facebook/react/issues/17912
createContext()
,它会返回undefined
。 - Jakub KotrsuseContext
。而当您希望它们根据某些行为动态更改时,您可以将该子树包装在提供新value
的Context.Provider
中(覆盖默认值)。在 React 中,上下文不仅是状态管理机制,更像是依赖注入机制。如果您希望它成为状态存储,则将树包装在提供程序中,现在它就是一个状态存储。 - avepr