Họ đang đo gì
Bạn có đo trước khi tối ưu không, và có hiểu vì sao một useCallback đơn lẻ thường vô dụng.
Trả lời ngắn~30 giây
memo giúp khi một component re-render thường xuyên với props Y HỆT và việc render nó đắt. useMemo giúp khi phép tính thật sự đắt, hoặc khi bạn cần giữ ổn định tham chiếu để memo phía dưới có tác dụng. useCallback chỉ có ý nghĩa khi hàm được truyền xuống một component đã memo hoặc nằm trong mảng phụ thuộc — bọc một hàm rồi truyền cho một component thường là tốn công vô ích.
Giải thích sâu
Điều cần hiểu để dùng đúng: memo so sánh props bằng Object.is theo từng trường. Nên nếu bạn truyền một object hoặc mảng dựng inline (style={{…}}, items={[…]}), tham chiếu mới mỗi lần render và memo không bao giờ chặn được gì. Đây là lý do rất nhiều memo trong codebase thật hoàn toàn không có tác dụng, và người viết không biết vì không ai đo.
Chi phí của việc ghi nhớ cũng thật: mỗi useMemo giữ giá trị cũ trong bộ nhớ, so sánh mảng phụ thuộc mỗi lần render, và thêm một dòng cần đọc hiểu. Với một phép tính rẻ, so sánh phụ thuộc có thể tốn hơn chính phép tính. Vì thế react.dev nói thẳng rằng đây là tối ưu hoá hiệu năng, không phải mặc định — và cách chữa tốt nhất thường là cấu trúc lại component chứ không phải bọc thêm.
Cách cấu trúc lại hiệu quả nhất mình biết là đưa state XUỐNG chỗ dùng nó, hoặc truyền children thay vì render bên trong. Một component cha giữ state gõ phím sẽ re-render toàn bộ cây con mỗi ký tự; tách phần input ra thành component riêng thì phần còn lại không render lại, và bạn không cần memo nào cả. React Compiler (React 19) tự động hoá phần lớn việc này, nên biết nguyên lý còn có ích hơn biết cú pháp.
Câu hỏi tiếp theo họ sẽ hỏi
?React Compiler có làm ba hook này thừa không?
Phần lớn, với code tuân thủ Rules of React. Nó tự chèn ghi nhớ ở nơi cần. Nhưng nó chỉ làm được điều đó khi component thuần khiết — nên hiểu vì sao re-render xảy ra vẫn cần thiết, và code có side effect trong lúc render vẫn hỏng như trước.
Trả lời thế này là mất điểm
- Bọc
useCallbackquanh mọi hàm. Nếu component nhận nó khôngmemothì bạn chỉ thêm chi phí. - Tối ưu mà không mở React Profiler. Câu hỏi đầu tiên phải là “cái gì đang render lại và vì sao”.