ContextProvider 绑定了数据和相应的 dispatch 函数, 当调用 dispatch 函数时候改变相应的数据:
function App1() {
const [user, setUser] = useReducer(
(state, action) => {
if (action.type === "SETUSER") {
return {
name: action.payload
};
}
return state;
},
{ name: "default name" }
);
return (
<ContextProvider value={{ user, setUser }}>
<Childs />
</ContextProvider>
);
}
这时候所有的子节点都会因为这个 dispatch 动作而重新调用导致 re-render, 一个大的项目不可能完全用 Memo 来固定.
但是使用 Redux 就不会有这个问题, 只有被 connect 的组件才会 re-render.
所以实际项目中, 是有简单的方法避免 ContextProvider 数据变化导致子节点全部重新渲染吗? 还是不考虑这个性能问题?
(看过 react-redux 源码, 实现起来还是有点复杂的)