黑白梦黑白梦

  • 文章
  • 专栏
  • 文章
  • 专栏
全部文章

zustand 简易好用的 React 状态管理库

发布于 2023-12-15更新于 2024-05-13约 3 分钟

没有样板代码,没有额外学习成本,简单清晰,上手即用,配合 Immer 可使语句更简便。

支持中间件,比如很方便地将全局状态同步到 localStorage 缓存中。

https://www.npmjs.com/package/zustand

基础使用

定义:

import { create } from "zustand";

type SidebarStore = {
  isOpen: boolean;
  onOpen: () => void;
  onClose: () => void;
};

export  const useSidebar = create<SidebarStore>((set) => ({
  isOpen: false,
  onOpen: () => set({ isOpen: true }),
  onClose: () => set({ isOpen: false }),
}));

在 React 组件中使用:

const onOpen = useSidebar((state) => state.onOpen);
const onClose = useSidebar((state) => state.onClose);
const isOpen = useSidebar((state) => state.isOpen);

配合 immer 使用

通过 immer 的 produce 减少对象操作嵌套:

import { produce } from 'immer'

const useLushStore = create((set) => ({
  lush: { forest: { contains: { a: 'bear' } } },
  clearForest: () =>
    set(
      produce((state) => {
        state.lush.forest.contains = null
      }),
    ),
}))

也可以配合 immer 中间件使用:

https://docs.pmnd.rs/zustand/integrations/immer-middleware

import { create } from 'zustand'
import { immer } from 'zustand/middleware/immer'

export const useCountStore = create()(
  immer((set) => ({
    count: 0,
    increment: (qty) =>
      set((state) => {
        state.count += qty
      }),
    decrement: (qty) =>
      set((state) => {
        state.count -= qty
      }),
  })),
)

使用 localStorage 中间件

https://docs.pmnd.rs/zustand/integrations/persisting-store-data

import { create } from 'zustand'
import { persist, createJSONStorage } from 'zustand/middleware'

const useFishStore = create(
  persist(
    (set, get) => ({
      fishes: 0,
      addAFish: () => set({ fishes: get().fishes + 1 }),
    }),
    {
      name: 'food-storage', // 存储中项目的名称(必须唯一)
      storage: createJSONStorage(() => localStorage),
    },
  ),
)
目录
基础使用配合 immer 使用使用 localStorage 中间件

本文收录于专栏

一些好用的 npm 前端开源库

收集一些好用的前端开源库,主要是 npm 包

0 篇文章更新于 2025-10-20
上一篇一个 css 属性解决 codemirror 移动端滚动条触发网页下拉刷新问题下一篇Node.js 中 Blob、Buffer、Base64 相互转换

©2015-2026 黑白梦 粤ICP备15018165号

联系: heibaimeng@foxmail.com