Họ đang đo gì
Bạn có phân biệt state server với state client không — nhầm hai loại này là nguồn của phần lớn code state phức tạp.
Trả lời ngắn~30 giây
Mình chia state làm bốn loại rồi mới chọn công cụ. State máy chủ (dữ liệu từ API) thuộc về một thư viện caching như TanStack Query — nó có sẵn khoá cache, dedupe, làm mới nền, và bạn thôi phải viết loading/error bằng tay. State URL (bộ lọc, phân trang, tab) thuộc về thanh địa chỉ, vì nó phải chia sẻ và back/forward được. State cục bộ thì useState ngay tại component. Chỉ phần còn lại — thường rất nhỏ — mới cần store toàn cục.
Giải thích sâu
Sai lầm cấu trúc lớn nhất mình thấy là đổ dữ liệu API vào Redux. Bạn viết action, reducer, selector và middleware cho một thứ mà bản chất là CACHE của dữ liệu ở nơi khác — rồi phải tự giải quyết làm mới, hết hạn, request trùng và trạng thái cũ. Đó là hàng trăm dòng cho một bài toán đã được giải sẵn, và nó là lý do chính khiến các codebase React cũ có thư mục store khổng lồ.
State URL bị bỏ quên nhiều nhất, dù nó cho lợi ích lớn nhất trên mỗi dòng code. Nếu bộ lọc nằm trong useState, người dùng không gửi link cho đồng nghiệp được, nhấn back thì mất hết, và tải lại trang là về mặc định. Đưa nó vào query string giải quyết cả ba mà không thêm thư viện nào — và trên site tĩnh thì cần đọc tham số ở phía client để không phá prerender.
Khi thật sự cần store toàn cục — theme, phiên đăng nhập, giỏ hàng — thì tiêu chí chọn không phải tính năng mà là chi phí re-render. Context của React re-render MỌI consumer khi giá trị đổi, nên một context chứa cả object cấu hình sẽ khiến nửa cây render lại vì một trường không liên quan. Zustand hay Jotai cho phép đăng ký theo lát cắt, và đó thường là lý do kỹ thuật thật sự để chọn chúng.
Câu hỏi tiếp theo họ sẽ hỏi
?Vậy Redux còn chỗ đứng không?
Có, ở những ứng dụng có logic client phức tạp và cần time-travel debugging hay ghi lại hành động — công cụ chỉnh sửa, bảng điều khiển giao dịch. Redux Toolkit cũng bớt rườm rà hơn Redux ngày xưa rất nhiều. Vấn đề chưa bao giờ là Redux, mà là dùng nó cho dữ liệu API.
Trả lời thế này là mất điểm
- Chọn thư viện trước rồi mới xem có bài toán gì. Câu hỏi đầu tiên phải là “state này thuộc về ai”.
- Đưa mọi thứ vào một context duy nhất. Nó chạy được cho tới khi ứng dụng đủ lớn để cảm nhận được độ trễ khi gõ.