Giải mã bí kíp fetch dữ liệu siêu tốc trong React: Tạm biệt useEffect "ác mộng"!
Lê Lân
0
Cách Tiếp Cận Mới Trong Fetch Dữ Liệu React: Prefetching, Shared Store và Custom Hook
Mở Đầu
Khi xây dựng ứng dụng React hiện đại, đặc biệt là những ứng dụng cần lấy dữ liệu từ bên ngoài (ví dụ như cơ sở dữ liệu phim), bạn thường sử dụng useEffect() như công cụ chính để xử lý fetch dữ liệu. Tuy nhiên, phương pháp này tồn tại nhiều hạn chế như không hỗ trợ server-side rendering, gây ra mạng thác nước (network waterfalls), hiện tượng race conditions và thiếu khả năng caching hay preload dữ liệu hiệu quả.
Trong bài viết này, tôi sẽ giới thiệu một kỹ thuật đơn giản, dễ mở rộng và không phụ thuộc thư viện bên ngoài để quản lý fetch dữ liệu trong React. Phương pháp này sử dụng các tính năng cốt lõi của JavaScript như sự kiện (events) và bộ nhớ đệm (memory caching) để tăng hiệu quả và trải nghiệm người dùng trong các ứng dụng đơn trang (SPA). Hãy cùng khám phá!
👎 Cách Cũ: useEffect() Sử Dụng Ồ Ạt
Phân Tích Vấn Đề Với useEffect()
Thông thường, bạn sẽ có những hàm fetch dữ liệu như:
getActorList() lấy danh sách diễn viên
getActorDetails(id) lấy chi tiết diễn viên theo ID
Và mỗi trang hoặc thành phần sẽ gọi các hàm này bên trong hook useEffect() để thực hiện fetch dữ liệu sau khi component render.
Nhưng điều này dẫn tới:
Dữ liệu được lấy sau khi component đã render, gây chậm trễ trong hiển thị.
Khi chuyển trang, những request giống nhau bị gọi lại nhiều lần, không tận dụng được cache.
Không có cách đơn giản để chia sẻ dữ liệu giữa các component hoặc duy trì dữ liệu giữa các lần chuyển trang.
Việc sử dụng quá nhiều useEffect() cho fetch dẫn đến một cấu trúc khó bảo trì, kém tối ưu.
✅ Cách Mới: Prefetching + Shared Store + Custom Hook
1. Kho Dữ Liệu Chung (Shared Data Store)
Thay vì fetch dữ liệu rải rác trong các component, ta giữ một store chung trong bộ nhớ dưới dạng một đối tượng Map hoặc Object để lưu trữ dữ liệu theo key.
const store = newMap();
Các component hoặc hook sẽ tương tác với store này để truy xuất hoặc lắng nghe dữ liệu mới.
2. Custom Hook: useData(key)
Hook này kiểm tra dữ liệu có trong store không. Nếu có, trả về ngay dữ liệu đó. Nếu chưa có, nó lắng nghe sự kiện dataFetched để cập nhật khi dữ liệu được nạp.
Cơ chế làm mới dữ liệu (cache invalidation) theo thời gian hoặc thủ công.
Đây là một nền tảng mạnh mẽ cho những ứng dụng cần tối ưu đơn giản, từ đó bạn có thể phát triển thêm theo nhu cầu.
Tôi rất mong nhận được phản hồi từ bạn: liệu bạn đã từng dùng phương pháp tương tự chưa? Bạn thường dùng cách nào để quản lý dữ liệu client-side trong React?