0Pricing
React Academy · 课时

使用持久化中间件保存状态

使用 persist 中间件将 Zustand 状态同步到 localStorage 或 sessionStorage。

使用持久化中间件保存状态 是 CoddyKit 上的免费 React Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 React Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 React Academy 课程共包含 4 节课。

欢迎

在本课中,您将使用 Zustand 的 persist 中间件自动将 store 状态同步到 localStorage,使状态在页面重新加载后仍然保留。

为什么要持久化状态?

如果没有持久化,用户刷新页面时所有 store 状态都会重置。将购物车项目、用户偏好或界面状态(如打开的面板)持久化到 localStorage,可以让用户在不同会话之间获得流畅的体验。

persist 中间件

使用 persist() 包装 create() 调用,并提供唯一的存储键。Zustand 会在挂载时自动从 localStorage 读取数据,并在每次状态变化时写入数据。
import { create } from 'zustand';
import { persist } from 'zustand/middleware';

const useCartStore = create(
  persist(
    (set) => ({
      items: [],
      addItem: (item) => set(s => ({ items: [...s.items, item] })),
    }),
    { name: 'cart-storage' } // localStorage key
  )
);

使用 partialize 进行部分持久化

使用 `partialize` 只持久化 store 中的特定切片。这样可以将临时数据(例如加载标志)排除在 localStorage 之外。
persist(
  (set) => ({ user: null, token: null, loading: false, fetch: () => {} }),
  {
    name: 'auth-storage',
    partialize: (state) => ({ user: state.user, token: state.token }),
    // loading and fetch are NOT persisted
  }
)

使用 sessionStorage

如果只希望在浏览器会话期间持久化数据(关闭标签页时清除),请将 `createJSONStorage(() => sessionStorage)` 作为存储选项传入。
import { createJSONStorage } from 'zustand/middleware';

persist(storeCreator, {
  name: 'session-data',
  storage: createJSONStorage(() => sessionStorage),
})

版本控制与迁移

当 store 的结构发生变化(新增字段或重命名键)时,请设置 `version` 编号,并提供 `migrate` 函数来升级旧的持久化数据。
persist(storeCreator, {
  name: 'my-store',
  version: 2,
  migrate: (persistedState, version) => {
    if (version === 1) {
      return { ...persistedState, newField: 'default' };
    }
    return persistedState;
  },
})

水合与 SSR

在服务器端(Next.js)不存在 localStorage。Zustand 的 persist 中间件会妥善处理这种情况:它会跳过服务器端水合,并在客户端挂载后重新水合。

onRehydrateStorage 回调

使用 `onRehydrateStorage` 在 store 从存储中恢复时运行代码。这对于在令牌恢复后触发接口调用很有用。
persist(storeCreator, {
  name: 'auth',
  onRehydrateStorage: () => (state) => {
    if (state?.token) state.fetchUser();
  },
})

清除持久化状态

调用 `useMyStore.persist.clearStorage()` 可从 localStorage 中移除持久化数据,这对于退出登录流程很有用。
const handleLogout = () => {
  useAuthStore.persist.clearStorage();
  useAuthStore.setState({ user: null, token: null });
};

存储大小限制

localStorage 每个来源的容量限制为 5–10 MB。请避免持久化大型数据集(例如完整的产品目录),只持久化标识符或较小的配置对象。

快速检查

persist 中间件中的哪个选项可以排除某些状态字段,使其不被保存到 localStorage?

回顾

使用 persist() 包装 Zustand store,并提供 name 键。使用 partialize 只存储相关切片。当 store 结构发生变化时,请进行版本控制并迁移。退出登录时使用 clearStorage()。

接下来

下一课:**Zustand DevTools 与 store 测试**——您将连接 Redux DevTools,并为 Zustand 操作编写单元测试。

常见问题解答

「使用持久化中间件保存状态」课时是免费的吗?

是的 — 「使用持久化中间件保存状态」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 React Academy 课程的其余内容,请升级到 CoddyKit PRO。 React Academy 课程共包含 4 节课。

「使用持久化中间件保存状态」这节课中我会学到什么?

使用 persist 中间件将 Zustand 状态同步到 localStorage 或 sessionStorage。 你通过在浏览器中直接运行的动手代码来练习 React Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 React Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 React Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「使用持久化中间件保存状态」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 React Academy 课中编写并运行代码吗?

能。每节 React Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 创建您的第一个 Zustand Store
  2. 选择器与避免不必要的重新渲染
  3. 使用持久化中间件保存状态
  4. Zustand DevTools 与 Store 测试
← 返回 React Academy