编辑:我实际上认为我错了,但我不确定。如果您编写自己的具有状态的提供程序,我的回复对这种情况有效。如果您只是使用提供 setter 的默认提供程序,我会同意 Amel 的回复。
我个人不会这样做,但这更像是一种观点。但是,像往常一样,这在很大程度上取决于您想要达到的目标。
这样做的一个积极方面是,useState 给定的状态设置器在每次重新渲染时始终保持不变。如果您传递自定义值,您应该避免它过于频繁地更改,因为使用 useContext 监听更改的每个组件都会重新呈现。
我仍然希望通过回调传递一个自定义对象(例如来自 useMemo 以避免不必要的重新渲染)来设置状态。如果您想在将来提供更多内容,则更容易扩展。
像这样的东西(非常简单的例子,这样当然没有意义,只是为了理解):
function MyProvider({children}) {
const [state, setState] = useState(0);
const provided = useMemo(() => ({
value: state,
setValue: (value) => setState(value)
}, [value]);
return <MyContext.Provider value={provided}>{children}</MyContext.Provider>;
}
在使用上下文的每个地方都可以在不更改代码的情况下进行扩展。但是,我仍然认为传递二传手并没有什么特别糟糕的,如果这是你想要实现的。