Class 13: useMemo và useCallback
useMemo là gì?
useMemo là một hook của React dùng để ghi nhớ kết quả tính toán và chỉ tính lại khi dependency thay đổi.
Cú pháp:
const memoizedValue = useMemo(() => {
// Logic tính toán nặng
return result;
}, [dependencies]);useMemotrả vềresultđã ghi nhớ.Nếu
dependencieskhông đổi, React sẽ không gọi lại hàm bên trong, giúp tránh tính toán lại không cần thiết.
Khi nào cần dùng useMemo?
useMemo?Khi một hàm trả về giá trị tính toán nặng (như filter, sort, reduce, loop lớn).
Khi bạn muốn tránh render lại component con có
React.memomà phụ thuộc vào prop từ hàm tính toán.
useCallback là gì?
useCallback là hook dùng để ghi nhớ một hàm (function) và chỉ tạo lại khi dependency thay đổi.
Cú pháp:
const memoizedCallback = useCallback(() => {
// Hàm xử lý logic
}, [dependencies]);Khi nào cần dùng useCallback?
useCallback?Khi truyền callback xuống component con dùng
React.memo.Khi callback được dùng trong các effect hoặc trong dependency array.
useCallback(fn, deps)tương đương vớiuseMemo(() => fn, deps)
So sánh useMemo và useCallback
Ghi nhớ
Giá trị trả về
Hàm (function)
Trường hợp dùng
Tính toán nặng
Callback truyền xuống component con
Tránh re-render
Giá trị prop không đổi
Callback prop không đổi
Tối ưu
Performance (render UI)
Performance (callback & children)
Ví dụ minh họa re-render không cần thiết
Ta có component cha tính toán giá trị lớn, truyền xuống component con. Nếu không dùng useMemo hoặc useCallback, component con có thể bị re-render dù props không đổi.
Component con dùng React.memo
React.memoComponent cha không dùng useCallback → bị re-render mỗi lần
useCallback → bị re-render mỗi lần➡️ Child bị re-render mỗi lần count thay đổi vì handleClick là hàm mới mỗi lần render.
Dùng useCallback để tối ưu
➡️ Child không bị render lại khi count thay đổi.
Thực hành: So sánh performance với React.memo
Mục tiêu:
Tạo 2 phiên bản
Parent(1 dùnguseCallback, 1 không dùng).Mỗi
Parentcó 1ChilddùngReact.memo.Thêm console.log để xem lần render.
Bài tập:
Tạo component
ExpensiveComponent:Tính toán một dãy số lớn (100,000 phần tử).
Dùng
useMemođể tối ưu hóa.
Tạo component cha dùng
useMemovà không dùnguseMemo.So sánh thời gian render.
Ghi lại log console để xác định component nào bị render lại và lý do.
Gợi ý nâng cao
Kết hợp
React.memo,useMemo,useCallbackđể tối ưu hệ thống component phức tạp.Chỉ nên dùng
useMemo/useCallbackkhi có vấn đề về hiệu năng – tránh lạm dụng vì có thể gây tốn bộ nhớ.
Last updated