Cả hai đều quản lý state trong component; useReducer là dạng tổng quát hơn cho logic cập nhật phức tạp.
useState: cập nhật trực tiếp bằng setter — hợp state đơn giản, độc lập (một cờ boolean, một chuỗi input).useReducer(reducer, initialState): gom logic cập nhật vào một hàm reducer thuần(state, action) => newState; component chỉdispatch(action)để mô tả "chuyện gì xảy ra", reducer quyết định state mới thế nào.
Chọn useReducer khi:
- Nhiều field state liên quan cần cập nhật cùng nhau (form nhiều bước, state có sub-object).
- State kế tiếp phụ thuộc state trước theo nhiều nhánh (đóng/mở/loading/error).
- Muốn tách logic ra khỏi UI: reducer là hàm thuần → dễ test độc lập, dễ đọc khi có nhiều loại action.
- Tối ưu: dispatch có tham chiếu ổn định, truyền xuống con sâu mà không cần useCallback.
Ưu điểm phụ: mọi cách state đổi được tập trung một chỗ (reducer) thay vì rải rác nhiều lời gọi setter — dễ suy luận và debug. Với state đơn giản thì useState gọn hơn, đừng dùng reducer cho mọi thứ.