Senior #strictmode#purity#useeffect
StrictMode render hai lần để làm gì? Component pure nghĩa là gì?
⚡ Trả lời nhanh
Ở dev, StrictMode gọi render (và updater, reducer, useMemo) hai lần để lộ side effect trong lúc render, và từ React 18 còn mount, unmount, mount lại effect để kiểm tra cleanup. Chỉ chạy ở development, không ảnh hưởng production.
Quy tắc: render phải pure, cùng props/state/context thì cho cùng JSX, không mutate biến ngoài, không gọi API, không đọc Math.random()/Date.now() trực tiếp để quyết định output.
let count = 0;
function Bad() {
count++; // mutate biến ngoài: StrictMode lộ ra (count tăng 2)
return <p>{count}</p>;
}
Hai cơ chế kiểm tra (dev):
- Double render: render, updater function,
useMemo/useStateinitializer chạy 2 lần, kết quả lần đầu bị bỏ. - Double effect (React 18+): mount, cleanup, mount lại để chắc rằng effect có cleanup đối xứng (hủy subscription, abort fetch).