Mid #context#useReducer#performance
useReducer và Context: vấn đề re-render và cách khắc phục?
⚡ Trả lời nhanh
Khi value của Context đổi (so sánh Object.is), mọi component dùng context đó đều re-render, kể cả khi chỉ cần một phần dữ liệu. Giảm bằng cách tách context (state/dispatch), memo hóa value, hoặc dùng store có selector.
const StateCtx = createContext(null);
const DispatchCtx = createContext(null);
function Provider({ children }) {
const [state, dispatch] = useReducer(reducer, initial);
return (
<DispatchCtx.Provider value={dispatch}>
<StateCtx.Provider value={state}>{children}</StateCtx.Provider>
</DispatchCtx.Provider>
);
}
dispatchcó identity ổn định, nên component chỉ gửi action (nút bấm) không re-render khi state đổi.- Truyền
value={{ a, b }}tạo object mới mỗi lần Provider render: bọcuseMemo. - Tách theo miền (AuthContext, ThemeContext) thay vì một context khổng lồ.
memoở con không ngăn được re-render do context: consumer luôn render lại khi value đổi.