Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。
核心优势对比
基本使用指南
1. 创建 Store
// store.js
import create from 'zustand'
const useStore = create((set) => ({
count: 0,
todos: [],
increase: () => set((state) => ({ count: state.count + 1 })),
decrease: () => set((state) => ({ count: state.count - 1 })),
addTodo: (text) => set((state) => ({
todos: [...state.todos, { id: Date.now(), text }]
})),
removeTodo: (id) => set((state) => ({
todos: state.todos.filter(todo => todo.id !== id)
}))
}))
2. 在组件中使用 Store
// Counter.jsx
import { useStore } from './store'
function Counter() {
const count = useStore(state => state.count)
const increase = useStore(state => state.increase)
const decrease = useStore(state => state.decrease)
return (
<div>
<button onClick={decrease}>-</button>
<span>{count}</span>
<button onClick={increase}>+</button>
</div>
)
}
3. 使用 Todo List
// TodoList.jsx
import { useStore } from './store'
function TodoList() {
const todos = useStore(state => state.todos)
const addTodo = useStore(state => state.addTodo)
const removeTodo = useStore(state => state.removeTodo)
const [input, setInput] = useState('')
const handleSubmit = (e) => {
e.preventDefault()
if (input.trim()) {
addTodo(input)
setInput('')
}
}
return (
<div>
<form onSubmit={handleSubmit}>
<input
value={input}
onChange={(e) => setInput(e.target.value)}
placeholder="添加新任务"
/>
<button type="submit">添加</button>
</form>
<ul>
{todos.map(todo => (
<li key={todo.id}>
{todo.text}
<button onClick={() => removeTodo(todo.id)}>删除</button>
</li>
))}
</ul>
</div>
)
}
高级功能
1. 选择器优化(自动避免不必要的渲染)
// 使用选择器精确获取需要的数据
const count = useStore(state => state.count)
// 等价于传统的解决方案:
// const count = useSelector(state => state.count) // Redux
2. 计算值(Derived state)
// 在 create 函数中
const useStore = create((set, get) => ({
// ...其他状态...
completedTodos: () => get().todos.filter(todo => todo.completed),
completedCount: () => get().completedTodos().length
}))
3. 异步操作
const useStore = create((set) => ({
posts: [],
loading: false,
error: null,
fetchPosts: async () => {
set({ loading: true })
try {
const response = await fetch('https://api.example.com/posts')
const data = await response.json()
set({ posts: data, loading: false })
} catch (error) {
set({ error, loading: false })
}
}
}))
// 在组件中调用
useEffect(() => {
useStore.getState().fetchPosts()
}, [])
4. 状态持久化(localStorage)
import create from 'zustand'
import { persist } from 'zustand/middleware'
const useStore = create(persist(
(set) => ({
darkMode: false,
toggleDarkMode: () => set(state => ({ darkMode: !state.darkMode }))
}),
{
name: 'theme-storage', // localStorage 键名
}
))
5. 插件系统(如 Redux DevTools 集成)
import { devtools } from 'zustand/middleware'
const useStore = create(devtools((set) => ({
// ...
})))
React + Zustand 完整示例
// App.jsx
import React from 'react'
import Counter from './Counter'
import TodoList from './TodoList'
import ThemeSwitcher from './ThemeSwitcher'
function App() {
return (
<div className="app">
<Counter />
<TodoList />
<ThemeSwitcher />
</div>
)
}
// ThemeSwitcher.jsx
import { useStore } from './store'
function ThemeSwitcher() {
const darkMode = useStore(state => state.darkMode)
const toggleDarkMode = useStore(state => state.toggleDarkMode)
return (
<div style={{ background: darkMode ? '#333' : '#fff', color: darkMode ? '#fff' : '#000' }}>
<h2>当前主题: {darkMode ? '暗黑' : '明亮'}</h2>
<button onClick={toggleDarkMode}>切换主题</button>
</div>
)
}
状态更新模式对比
1. 基础更新
set({ count: 42 }) // 直接设置
2. 基于当前状态更新
set(state => ({ count: state.count + 1 }))
3. 部分状态合并
set({ newProperty: 'value' }) // 自动合并到现有状态
4. 深度状态更新(使用 Immer)
import produce from 'immer'
const useStore = create(set => ({
user: {
name: 'John',
address: {
city: 'New York'
}
},
updateCity: (city) => set(produce(state => {
state.user.address.city = city
}))
}))
与其他状态管理方案整合
1. 与 React Context 配合使用
const StoreContext = createContext()
export const StoreProvider = ({ children }) => {
const store = useRef(useStore).current
return (
<StoreContext.Provider value={store}>
{children}
</StoreContext.Provider>
)
}
// 在组件中使用
export const useStoreContext = () => useContext(StoreContext)
2. 与 React Query 结合(数据获取)
// 在 Zustand store 中
{
fetchUser: async (id) => {
const response = await fetch(`/api/users/${id}`)
const data = await response.json()
set({ user: data })
}
}
// 在组件中
const fetchUser = useStore(state => state.fetchUser)
useEffect(() => {
fetchUser(userId)
}, [userId, fetchUser])
性能优化技巧
1. 细粒度选择器
// 只订阅 todos 数组,而非整个 state
const todos = useStore(state => state.todos)
2. 使用 shallow 比较
import shallow from 'zustand/shallow'
// 选择多个状态值
const { count, theme } = useStore(
state => ({ count: state.count, theme: state.theme }),
shallow
)
3. 批处理多个更新
set({
count: 10,
todos: updatedTodos
})
总结:为什么选择 Zustand?
- 极简 API:只需一个 create 函数即可创建 store
- 高性能:精确的状态订阅避免了不必要的渲染
- 灵活性:支持异步操作、中间件和持久化
- 零依赖:无冗余依赖,包大小仅约 1KB
- 简单与强大并存:既适合小型项目,也能胜任大型复杂应用
Zustand 提供了一种简约而不简单的状态管理方案,非常适合现代 React 应用开发。它消除了 Redux 的模板代码,同时提供了同样强大的功能,是状态管理方案的理想选择。
zustan与redux相比有什么优点
- 引用 10 篇资料作为参考
- zustand 跟 redux 有什么区别?zustand 的优势是什么? 解决redux 的哪些问题?Zustand - 掘金
- 是时候放弃redux了,zustand是完美替代者(主要是源码分析) - 掘金
- 前端状态管理库 redux vs zustand前端状态库 redux vs zustand,redux是数据单向流时代 - 掘金
- [开源]一个开源、免费在线数据建模、元数据管理平台,简单易用
- 一文掌握 TanStack Query:让 React 数据管理变得简单高效
- React状态管理新篇章:深入剖析Zustand库的优势与应用-易源AI资讯 | 万维易源
- 【早阅】Zustand采纳指南
- zustand --一款轻量级别的状态管理工具_zustand官网-CSDN博客
- 告别繁杂的状态管理:Zustand 的简洁之道1. Zustand Zustand 是一个轻量级的状态管理库,用于 Ja - 掘金
- 前端开发新趋势:使用 Zustand 打造轻量级状态管理-CSDN博客
Zustand 相比 Redux 的核心优势在于简洁性、性能优化和开发体验,以下是详细对比:
🚀 一、设计理念与开发体验
⚡ 二、性能优化机制
🔧 三、灵活性与扩展性
💡 四、典型场景对比
// ✅ Zustand 示例(15行代码实现计数器)
import create from 'zustand';
const useCounter = create((set) => ({
count: 0,
increment: () => set(state => ({ count: state.count + 1 })),
reset: () => set({ count: 0 })
}));
function Counter() {
const { count, increment } = useCounter();
return <button onClick={increment}>{count}</button>;
}
// ❌ Redux 同等功能需约 50+ 行代码:
// 1. 定义 action types
// 2. 编写 action creators
// 3. 创建 reducer
// 4. 配置 store 和 Provider
// 5. 组件中用 useSelector/useDispatch
📌 总结:Zustand 的核心优势
- 极简开发:减少 70% 样板代码,提升开发效率;
- 开箱即用:内置异步、持久化、DevTools 支持;
- 性能卓越:精准更新组件,避免无效渲染;
- 渐进式适配:既适合小型项目,也能扩展至大型应用。
💡 建议选择策略:
- 中小项目/快速迭代 → Zustand;
- 超大型应用/严格状态追溯 → Redux + Redux Toolkit。
更多实践案例可参考:Zustand 官方文档 。