Nel*_*Luk 3 reactjs next.js react-context use-reducer context-api
我在官方的 next.js 示例中发现了这一点,state并且dispatch将信息放在了单独的上下文提供程序中。
这样做的意义何在?这种做法是否可以防止不必要的重新渲染?
export const CounterProvider = ({ children }) => {
const [state, dispatch] = useReducer(reducer, 0)
return (
<CounterDispatchContext.Provider value={dispatch}>
<CounterStateContext.Provider value={state}>
{children}
</CounterStateContext.Provider>
</CounterDispatchContext.Provider>
)
}
export const useCount = () => useContext(CounterStateContext)
export const useDispatchCount = () => useContext(CounterDispatchContext)
Run Code Online (Sandbox Code Playgroud)
如果几乎所有组件都同时使用状态和分派,则不需要将它们放在单独的 ContextProvider 中,只需确保在将它们作为对象传递时记住传递给提供程序值的参数。这样你的消费者只会在状态实际改变时重新渲染。还要注意,dispatch实例实际上并没有改变,所以没有必要为它创建一个单独的上下文
export const CounterProvider = ({ children }) => {
const [state, dispatch] = useReducer(reducer, 0)
const contextValue = useMemo(() => ({state, dispatch}), [state, dispatch])
return (
<CounterContext.Provider value={contextValue}>
{children}
</CounterContext.Provider>
)
}
Run Code Online (Sandbox Code Playgroud)
编辑:
正如@dcccale 在评论中指出的那样,如果您的应用程序中有很多组件在很大程度上只使用 dispatch 并且因此它们不会在状态更改时重新渲染,那么将 dispatch 和 state 保持在单独的上下文中是很有意义的.
即使我们contextValue用 useMemo hook记忆,contextValue每次更新state的值仍然会被重新评估,导致所有依赖于上下文的组件重新渲染,甚至其中一些只依赖于dispatchonly。
另见:https : //hswolff.com/blog/how-to-usecontext-with-usereducer/#performance-concerns
评估您的应用要求并明智地做出决定。
| 归档时间: |
|
| 查看次数: |
339 次 |
| 最近记录: |