Trong quá trình phát triển ứng dụng React, việc quản lý state toàn cục là một trong những thách thức lớn nhất.
Từ trước đến nay, Redux là lựa chọn kinh điển: mạnh mẽ, có hệ sinh thái lớn, nhưng lại thường bị chê vì rườm rà.
Sau đó, Redux Toolkit (RTK) ra đời để giải quyết chính điểm yếu này, giúp lập trình viên làm việc với Redux dễ dàng hơn.
Tuy nhiên, trong vài năm gần đây, Zustand nổi lên như một lựa chọn cực kỳ nhẹ, cú pháp đơn giản, không cần quá nhiều boilerplate mà vẫn đảm bảo hiệu năng cao.
Vậy câu hỏi đặt ra là:
Redux Toolkit và Zustand – cái nào nên dùng?

Redux Toolkit là gì?
Redux Toolkit (RTK) là bộ công cụ chính thức do nhóm Redux phát triển, giúp bạn:
-
Giảm bớt code lặp (boilerplate)
-
Tổ chức logic state theo mô hình "slice"
-
Tích hợp sẵn middleware như redux-thunk, immer, devtools
RTK vẫn giữ triết lý Flux của Redux (với store, action, reducer), nhưng mang lại trải nghiệm lập trình thân thiện hơn rất nhiều.
Ưu điểm
-
Cấu trúc code rõ ràng, dễ mở rộng
-
Dễ test và gỡ lỗi (Redux DevTools rất mạnh)
-
Quản lý state phức tạp dễ dàng
-
Cộng đồng lớn, tài liệu chính thức đầy đủ
Nhược điểm
-
Vẫn hơi "nặng" với dự án nhỏ
-
Học ban đầu cần nắm nhiều khái niệm như dispatch, reducer, thunk, selector
Zustand là gì?
Zustand là một thư viện quản lý state cho React được phát triển bởi tác giả của Jotai và React Spring.
Zustand hoạt động dựa trên hook (create) và cho phép bạn khai báo store chỉ trong vài dòng code.
Không cần reducer, không cần dispatch, mọi thứ hoạt động rất tự nhiên trong React.
Ưu điểm
-
Cực kỳ nhẹ, không rườm rà
-
Hiệu năng cao, tránh re-render không cần thiết
-
Dễ dùng với TypeScript
-
Dễ kết hợp với React Native, Next.js hoặc các web app nhỏ
Nhược điểm
-
Thiếu cấu trúc rõ ràng cho ứng dụng lớn
-
Không có nhiều middleware chính thức như Redux
-
Cộng đồng nhỏ hơn, ít ví dụ quy mô doanh nghiệp
So sánh chi tiết
| Tiêu chí | Redux Toolkit (RTK) | Zustand |
|---|---|---|
| Triết lý | Flux (Action → Reducer → Store) | Hook-based (create + set state) |
| Cấu trúc code | Tách biệt rõ slice, store, actions | Mọi thứ trong một file store |
| Middleware | Có sẵn (thunk, saga, logger, persist, ...) | Dùng thủ công (middleware từ Zustand) |
| DevTools | Có sẵn, mạnh mẽ | Có thông qua devtools() |
| Hiệu năng | Tốt, nhưng dễ re-render nếu selector chưa tối ưu | Rất tốt, nhờ selector tự động |
| Boilerplate | Trung bình | Cực ít |
| Phù hợp | Ứng dụng lớn, team đông, logic phức tạp | Ứng dụng nhỏ hoặc trung bình |
| Cộng đồng và tài liệu | Rất lớn, chính thức từ Redux | Đang phát triển nhanh, nhưng nhỏ hơn |
Code minh họa
Redux Toolkit
// store.ts
import { configureStore, createSlice } from '@reduxjs/toolkit'
const counterSlice = createSlice({
name: 'counter',
initialState: { value: 0 },
reducers: {
increment: (state) => { state.value++ },
decrement: (state) => { state.value-- },
},
})
export const { increment, decrement } = counterSlice.actions
export const store = configureStore({
reducer: { counter: counterSlice.reducer },
})
// Counter.tsx
import { useSelector, useDispatch } from 'react-redux'
import { increment } from './store'
function Counter() {
const count = useSelector((state) => state.counter.value)
const dispatch = useDispatch()
return <button onClick={() => dispatch(increment())}>{count}</button>
}
Zustand
// store.ts
import { create } from 'zustand'
export const useCounter = create((set) => ({
value: 0,
increment: () => set((state) => ({ value: state.value + 1 })),
decrement: () => set((state) => ({ value: state.value - 1 })),
}))
// Counter.tsx
import { useCounter } from './store'
function Counter() {
const { value, increment } = useCounter()
return <button onClick={increment}>{value}</button>
}
Khi nào nên chọn Redux Toolkit
-
Ứng dụng phức tạp (dashboard, CRM, e-commerce lớn, quản lý user hoặc role)
-
Team đông người, cần quy tắc và codebase rõ ràng
-
Cần middleware: logging, persist, async flow, time-travel debugging
-
Cần tích hợp dễ với các framework lớn như Next.js, Electron, React Native enterprise
Khi nào nên chọn Zustand
-
Dự án nhỏ hoặc trung bình, cần code nhanh, dễ hiểu
-
Ứng dụng React Native hoặc Next.js cần state nhẹ, hiệu năng cao
-
Prototype, MVP, hoặc sản phẩm cần ra mắt nhanh
-
Không muốn sử dụng nhiều cấu trúc Redux
Kết luận
Cả hai thư viện đều mạnh. Redux Toolkit mang lại cấu trúc chặt chẽ và dễ bảo trì, trong khi Zustand mang lại sự đơn giản và hiệu năng.
Nếu bạn đang làm dự án lâu dài, có nhiều module thì nên chọn Redux Toolkit.
Nếu bạn cần giải pháp nhẹ, nhanh, dễ viết thì nên chọn Zustand.
Điều quan trọng nhất không phải là thư viện nào tốt hơn, mà là chọn đúng công cụ cho đúng nhu cầu.
Lời kết từ Unicode
Tại Unicode Academy, khi dạy về React, chúng tôi thường cho học viên làm quen với Zustand trước để hiểu bản chất của state management, sau đó chuyển sang Redux Toolkit khi làm dự án thực tế có quy mô lớn.
Cách tiếp cận này giúp học viên hiểu sâu cách hoạt động của state, đồng thời có kỹ năng triển khai chuyên nghiệp trong môi trường doanh nghiệp.








