| name | zustand-state |
| description | Zustand state management for React and vanilla JavaScript. Use when creating stores, using selectors, persisting state to localStorage, integrating devtools, or managing global state without Redux complexity. Triggers on zustand, create(), createStore, useStore, persist, devtools, immer middleware. |
Zustand State Management
Minimal state management - no providers, minimal boilerplate.
Quick Reference
import { create } from 'zustand'
interface BearState {
bears: number
increase: (by: number) => void
}
const useBearStore = create<BearState>()((set) => ({
bears: 0,
increase: (by) => set((state) => ({ bears: state.bears + by })),
}))
const bears = useBearStore((state) => state.bears)
const increase = useBearStore((state) => state.increase)
State Updates
set({ bears: 5 })
set((state) => ({ bears: state.bears + 1 }))
set((state) => ({
nested: { ...state.nested, count: state.nested.count + 1 }
}))
set({ bears: 0 }, true)
Selectors & Performance
const bears = useBearStore((state) => state.bears)
const state = useBearStore()
import { useShallow } from 'zustand/react/shallow'
const { bears, fish } = useBearStore(
useShallow((state) => ({ bears: state.bears, fish: state.fish }))
)
const [bears, fish] = useBearStore(
useShallow((state) => [state.bears, state.fish])
)
Access Outside Components
const state = useBearStore.getState()
useBearStore.setState({ bears: 5 })
const unsub = useBearStore.subscribe((state) => console.log(state))
unsub()
Vanilla Store (No React)
import { createStore } from 'zustand/vanilla'
const store = createStore((set) => ({
bears: 0,
increase: (by) => set((state) => ({ bears: state.bears + by })),
}))
store.getState().bears
store.setState({ bears: 10 })
store.subscribe((state) => console.log(state))
Additional Documentation
Key Patterns
| Pattern | When to Use |
|---|
| Single selector | One piece of state needed |
useShallow | Multiple values, avoid rerenders |
getState() | Outside React, event handlers |
subscribe() | External systems, logging |
| Vanilla store | Non-React environments |
Gates (persist and devtools)
Before merging code that uses these middlewares (see references/middleware.md for setup):
persist — Pass when persisted keys are explicit (partialize or a reviewed full-state snapshot) and the JSON written to storage cannot include auth tokens, API keys, or other secrets.
devtools in shipped bundles — Pass when DevTools runs only in development (env gate), or you leave a one-line note in the PR explaining why it stays enabled in production.