Action trong Zustand là function thường sống cùng state trong store object — không action type, không dispatch, không reducer.
Ba pattern hay dùng:
ts
// 1. Partial update với set
increment: () => set((s) => ({ count: s.count + 1 })),
// 2. Đọc state hiện tại bằng get() trước khi ghi
addItem: (item) => {
const existing = get().items.find((i) => i.id === item.id)
set((s) => ({
items: existing
? s.items.map((i) => (i.id === item.id ? { ...i, qty: i.qty + 1 } : i))
: [...s.items, item],
}))
},
// 3. Async — không cần thunk middleware, viết async/await thẳng
fetchUser: async (id) => {
set({ loading: true })
const user = await api.getUser(id)
set({ user, loading: false })
},Nhiều lần cập nhật state trong cùng một lời gọi set được batch tự động.
Lưu ý: set chỉ shallow merge — object lồng nhau phải tự spread: set(s => ({ config: { ...s.config, theme: 'dark' } })).