Quy tắc giống React web: memo hoá chỉ có ích khi cần giữ reference ổn định cho thứ đang so sánh reference (React.memo, dependency array, props của FlatList). Khác biệt là trên máy Android cấu hình thấp, render thừa trong list dài dễ thành giật khi cuộn hơn trên web.
useCallback giữ reference của function ổn định giữa các render. Cần khi:
1. Truyền callback vào React.memo component → tránh unmemoize.
2. Truyền vào FlatList props (renderItem, keyExtractor, onEndReached) — nếu function mới mỗi render, FlatList re-render hết items visible.
3. Dùng làm dependency của useEffect — function mới mỗi render gây effect chạy lại liên tục.
useMemo cache kết quả của phép tính nặng:
1. Filter/sort/transform array lớn (>1000 items).
2. Tạo object/array làm prop cho React.memo component.
3. Compute style object phức tạp.
Khi nào KHÔNG cần:
- Function/value dùng nội bộ component, không pass cho memoized child → useCallback/useMemo cũng tốn memory để cache.
- Compute primitive đơn giản (x * 2, string concat ngắn) — overhead memo lớn hơn lợi ích.
Lưu ý: useCallback không "ngăn re-render" của component cha — nó chỉ giữ reference ổn định. Component cha vẫn re-render khi state của nó đổi; chỉ child bọc React.memo mới hưởng lợi. Nếu project bật React Compiler (bản 1.0 ra 10/2025), compiler tự memo hoá lúc build nên phần lớn useCallback/useMemo viết tay không còn cần.