Immutable state and merging
Like with React's useState
, we need to update state immutably.
Here's a typical example:
import { create } from 'zustand'
const useCountStore = create((set) => ({
count: 0,
inc: () => set((state) => ({ count: state.count + 1 })),
}))
The set
function is to update state in the store.
Because the state is immutable, it should have been like this:
set((state) => ({ ...state, count: state.count + 1 }))
However, as this is a common pattern, set
actually merges state, and
we can skip the ...state
part:
set((state) => ({ count: state.count + 1 }))
Nested objects
The set
function merges state at only one level.
If you have a nested object, you need to merge them explicitly. You will use the spread operator pattern like so:
import { create } from 'zustand'
const useCountStore = create((set) => ({
nested: { count: 0 },
inc: () =>
set((state) => ({
nested: { ...state.nested, count: state.nested.count + 1 },
})),
}))
For complex use cases, consider using some libraries that help with immutable updates. You can refer to Updating nested state object values.
Replace flag
To disable the merging behavior, you can specify a replace
boolean value for set
like so:
set((state) => newState, true)