Tối ưu hiệu năng render cho React Web và React Native bằng Memoization và Virtualized List

17 lượt xem · 2 trả lời

1. 13:13 13/10/2026
Tối ưu hiệu năng render là yếu tố then chốt để mang lại trải nghiệm mượt mà cho cả web và mobile. Dưới đây là những kỹ thuật thực tế đã được áp dụng thành công trong nhiều dự án production. ## 1. Hiểu rõ cơ chế re‑render React chỉ cập nhật DOM (hoặc native view) khi state hoặc props thay đổi. Tuy nhiên, component con thường bị render lại dù dữ liệu không đổi. Việc nắm rõ quy tắc so sánh tham chiếu giúp bạn quyết định đâu cần memoization. ## 2. Sử dụng React.memo, useMemo và useCallback - **React.memo**: Bọc component hàm để ngăn render lại khi props không đổi (so sánh shallow). - **useMemo**: Cache kết quả tính toán nặng (ví dụ: lọc, sắp xếp danh sách lớn). - **useCallback**: Giữ tham chiếu hàm ổn định để tránh truyền callback mới vào component con đã memo. Ví dụ thực tế: một màn hình danh sách sản phẩm với bộ lọc giá. Chỉ khi `filterValue` thay đổi mới tính toán lại `filteredProducts` bằng `useMemo`; các component `ProductItem` được wrap `React.memo` và nhận `onPress` từ `useCallback`. ## 3. Virtualized List cho dữ liệu lớn - **Web**: `react-window` hoặc `react-virtualized` chỉ render các item nằm trong viewport. - **React Native**: `FlatList` với `initialNumToRender`, `maxToRenderPerBatch`, `windowSize` và `getItemLayout` để tránh đo lường layout. Kết hợp virtualized list với memoization giúp giảm thời gian frame từ 30 ms xuống dưới 16 ms ngay cả khi danh sách có 10 000 mục. ## 4. Profiling và đo lường liên tục - Sử dụng **React DevTools Profiler** (web) và **Flipper + React DevTools** (native) để phát hiện component render thừa. - Thiết lập CI gate: nếu tổng thời gian render của màn hình chính vượt 100 ms thì build fail. ## 5. Checklist nhanh trước khi release - [ ] Tất cả component con đã có `React.memo` nơi cần. - [ ] Các hàm callback dùng `useCallback`. - [ ] Danh sách lớn dùng virtualized list. - [ ] Không có side‑effect nặng trong render (network, localStorage). - [ ] Profiler không báo warning “Did not render”. Áp dụng hệ thống này giúp team giảm 40 % thời gian render trung bình và tăng điểm Lighthouse/Performance trên mobile lên 90+.
0 Facebook
2. 16:35 13/10/2026
Trả lời Quản Trị Viên Tối ưu hiệu năng render là yếu tố then chốt để mang lại trải nghiệm mượt mà cho cả web và mobile. Dưới đây là những kỹ t…
Bài viết rất thực tế, cảm ơn admin đã tổng hợp checklist rõ ràng. Mình muốn bổ sung một chút kinh nghiệm khi dùng `FlatList` trên React Native: việc định nghĩa `getItemLayout` giúp bỏ qua bước đo lường layout (measure) cho từng item, giảm hẳn lag khi scroll lần đầu, đặc biệt khi item có chiều cao cố định. Còn với `react-window` trên web, mình hay dùng `FixedSizeList` thay vì `VariableSizeList` nếu item đồng nhất để tránh overhead tính toán vị trí. Một điểm hay bị bỏ qua là `key` prop – dùng index làm key khi danh sách có sắp xếp/lọc sẽ khiến React diff sai, buộc re-render toàn bộ thay vì move node. Mình đã từng gặp case danh sách 500 item mà scroll giật vì key trùng lặp sau khi filter. Về profiling, team mình hay bật "Record why each component rendered" trong DevTools để bắt ngay component con render thừa do reference thay đổi (object/array inline trong render). Cách này tiết kiệm thời gian debug hơn là chỉ nhìn flamegraph. Admin có chia sẻ thêm kinh nghiệm xử lý virtualized list khi item có độ cao động (dynamic height) không? Phần này mình thấy khó tối ưu nhất trên cả hai nền tảng.
0
3. 20:32 26/10/2026
Trả lời Bùi Quang Bài viết rất thực tế, cảm ơn admin đã tổng hợp checklist rõ ràng. Mình muốn bổ sung một chút kinh nghiệm khi dùng `FlatL…
Với item cao động, mình thấy nguyên tắc là đừng cố ép `getItemLayout` nếu chưa có chiều cao thật; đoán sai còn tệ hơn để list tự measure. Trên React Native, mình thường
0
Vui lòng đăng nhập để tham gia trả lời chủ đề này.
Điều hướng nhanh

Bạn muốn khám phá điều gì?

Tìm chủ đề, bài viết hoặc đi thẳng đến một khu vực của cộng đồng.

Esc để đóng Ctrl K để mở lại