0Pricing
Frontend Academy · 课时

使用 Zustand 管理轻量级 React 状态

使用 create() 创建 Zustand 仓库,通过 Hook 读取状态,使用操作更新状态,并享受无需样板代码的简洁 API。

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

什么是 Zustand?

Zustand 是一个精简、快速的 React 状态管理库。它的整个 API 非常小:创建一个 store,再使用钩子读取和更新它。无需归约器、操作或样板代码。

创建 store

create() 将状态和操作定义为一个普通对象。返回值是一个钩子。

import { create } from 'zustand';

interface CounterStore {
  count: number;
  increment: () => void;
  decrement: () => void;
  reset: () => void;
}

export const useCounterStore = create<CounterStore>((set) => ({
  count: 0,
  increment: () => set(state => ({ count: state.count + 1 })),
  decrement: () => set(state => ({ count: state.count - 1 })),
  reset: () => set({ count: 0 }),
}));

读取 store 状态

使用选择器函数调用该钩子,以订阅特定的状态片段。只有所选片段发生变化时,组件才会重新渲染。

function Counter() {
  const count = useCounterStore(state => state.count);
  return <p>Count: {count}</p>;
}

读取操作

以相同方式选择操作。操作不会变化,因此选择它们不会导致额外的重新渲染。

function Controls() {
  const { increment, decrement } = useCounterStore(
    state => ({ increment: state.increment, decrement: state.decrement })
  );
  return (
    <div>
      <button onClick={increment}>+</button>
      <button onClick={decrement}>-</button>
    </div>
  );
}

使用 set() 更新状态

set() 函数会以浅层方式合并更新(类似于 React 类组件中的 setState)。对于依赖之前状态的更新,请传入一个函数。

// Merge:
set({ loading: true });

// Function for dependent updates:
set(state => ({ count: state.count + 1 }));

// Replace entirely (replace: true):
set({ count: 0, loading: false }, true);

异步操作

Zustand 中的操作可以是异步的——只需在等待异步操作完成后调用 set()。

export const useUsersStore = create<UsersStore>((set) => ({
  users: [],
  loading: false,
  fetchUsers: async () => {
    set({ loading: true });
    const users = await fetch('/api/users').then(r => r.json());
    set({ users, loading: false });
  }
}));

切片——组合大型 store

将大型 store 拆分为切片(独立的对象),再将它们组合起来。Zustand 的模式并不要求使用切片抽象,但这是组织大型 store 的清晰方式。

中间件:persist

persist 中间件会将 Zustand 状态保存到 localStorage,并在加载时恢复状态——设置过程非常简单。

import { persist } from 'zustand/middleware';

export const useSettingsStore = create<Settings>(
  persist(
    (set) => ({
      theme: 'light',
      setTheme: (theme) => set({ theme })
    }),
    { name: 'app-settings' } // localStorage key
  )
);

中间件:devtools

通过 devtools 中间件为 Zustand 添加 Redux DevTools 支持。您可以获得完整的操作日志记录和时间旅行调试功能。

Zustand 与 Redux Toolkit

Zustand:精简、没有样板代码、设置快速,非常适合小型到中型 app。RTK:结构化、可扩展、DevTools 一流,更适合大型团队。两者都是可靠的选择——对于大多数 app,Zustand 的简洁性更胜一筹。

选择器与性能

始终只选择组件所需的最小状态片段。选择整个状态对象会导致 store 的任何变化都触发重新渲染。对于选择多个属性,请使用 zustand/shallow 中的 shallow。

import { shallow } from 'zustand/shallow';

const { theme, font } = useSettingsStore(
  state => ({ theme: state.theme, font: state.font }),
  shallow // compare each property shallowly
);

快速检查

如何创建一个整个 React app 都可以使用的 Zustand store?

总结:Zustand

create() 定义状态和操作。返回值是一个钩子。选择状态片段以避免不必要的重新渲染。set() 合并状态更新。异步操作在 await 之后调用 set()。使用 persist 中间件保存到 localStorage。使用 devtools 集成 Redux DevTools。无需 Provider。

常见问题解答

「使用 Zustand 管理轻量级 React 状态」课时是免费的吗?

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

「使用 Zustand 管理轻量级 React 状态」这节课中我会学到什么?

使用 create() 创建 Zustand 仓库,通过 Hook 读取状态,使用操作更新状态,并享受无需样板代码的简洁 API。 你通过在浏览器中直接运行的动手代码来练习 Frontend Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Frontend Academy 需要有经验吗?

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

「使用 Zustand 管理轻量级 React 状态」课时需要多长时间?

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

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

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

此课程中的所有课时

  1. Redux Toolkit:createSlice 与 configureStore
  2. 使用 Zustand 管理轻量级 React 状态
  3. Pinia for Vue:defineStore 与 storeToRefs
  4. 何时使用全局状态与本地状态
← 返回 Frontend Academy