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 源码, 实现起来还是有点复杂的)
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.