mcpField
R
react-state

react-state

github.com/fusengine开发3443 次安装2 周前更新
代码仓库

关于 react-state

react-state 是用于在 React 应用中实现 Zustand v5 状态管理的技能,重点介绍类型安全的 Store、选择器性能、中间件组合和按领域组织状态;服务端状态则建议使用 TanStack Query。

主要功能

  1. 01Zustand v5 TypeScript Store 模式
  2. 02选择器与 useShallow 使用指导
  3. 03组合 devtools、persist 和 immer
  4. 04按领域拆分 Store
  5. 05v4 迁移与反模式指导

适用场景

  1. 01为 React 应用添加共享状态
  2. 02组织 auth、cart 和 UI Store
  3. 03持久化选定状态且不保存令牌
  4. 04将 Store 代码从 Zustand v4 迁移

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/fusengine/agents --skill react-state

安装后在 Claude Code 中输入/react-state确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
auto-selectors.md
installation.md
middleware.md
migration-v5.md
reset-state.md
slices.md
store-patterns.md
subscribe-api.md
testing.md
typescript.md

详细介绍

为 React 应用实现 Zustand v5 全局状态管理:v5 柯里化语法(`create()((set) => ({...}))`)、选择器模式(`useStore((s) => s.field)`)、使用 `useShallow` 处理数组/对象选择器以避免不必要的重新渲染,以及中间件组合(devtools → persist → immer;顺序会影响 TypeScript)。

介绍按领域拆分 store(auth、cart、ui、theme),而非使用一个庞大的 store;遵循 SOLID 的文件组织方式(store.ts、store.interface.ts、use-store.ts);以及禁止的模式(持久化 auth 令牌、使用 v4 语法、跳过 useShallow)。这是 Zustand 的纯 React 版本(不涉及 App Router 请求隔离问题)。关于 Next.js App Router,请参阅 nextjs-zustand;对于服务端状态,请使用 TanStack Query,而非此技能。

React 的 Zustand

借助 React 18+ 的 useSyncExternalStore,实现精简、可扩展的状态管理。

Agent 工作流(强制)

在进行任何实现之前,必须并行启动 3 个 Agent,每个 Agent 调用一次并指定一个 name:

  1. fuse-ai-pilot:explore-codebase - 分析现有 store 和状态模式
  2. fuse-ai-pilot:research-expert - 通过 Context7/Exa 核实最新的 Zustand v5 文档
  3. mcp__context7__query-docs - 检查中间件和 TypeScript 模式

实现完成后,运行 fuse-ai-pilot:sniper 进行验证。


概览

适用场景
  • 管理 React 应用中的全局状态
  • 需要在组件间共享状态
  • 将状态持久化到 localStorage/sessionStorage
  • 构建 UI 状态(模态框、侧边栏、主题、购物车)
  • 用于替代复杂状态场景中的 React Context
为什么选择 Zustand v5
特性优势
极简 API简单的 create() 函数,无需样板代码
原生支持 React 18使用 useSyncExternalStore,无需垫片
TypeScript 优先通过柯里化模式实现完整类型推断
中间件栈devtools、persist、immer 可组合使用
包体积gzip 压缩后约 2KB,是最小的状态管理库
无需 Provider可直接访问 store,无需 Context 包装器

关键规则

  1. 数组/对象使用 useShallow - 避免不必要的重新渲染
  2. 使用 v5 柯里化语法 - create<State>()((set) => ({...}))
  3. 遵循 SOLID 路径规范 - Store 放在 modules/[feature]/src/stores/
  4. 拆分 store - 每个领域使用一个 store(auth、cart、ui、theme)
  5. 服务端状态另行管理 - 服务端状态使用 TanStack Query

SOLID 架构

模块结构

按功能模块组织 store:

  • modules/cores/stores/ - 共享 store(主题、UI)
  • modules/auth/src/stores/ - Auth 状态
  • modules/cart/src/stores/ - 购物车状态
  • modules/[feature]/src/interfaces/ - Store 类型
文件组织
文件用途最大行数
store.ts使用 create() 创建 store50
store.interface.tsTypeScript 接口30
use-store.ts带选择器的自定义 Hook20

核心概念

Store 创建(v5 语法)

TypeScript 类型推断需要使用双括号。柯里化模式可确保完整的类型安全。

中间件组合

按顺序叠加中间件:devtools -> persist -> immer。顺序会影响 TypeScript 类型。

选择器模式

为提升性能,始终使用 useStore((s) => s.field)。数组/对象选择器使用 useShallow。


参考指南

需求参考资料
初始设置installation.md
Store 模式store-patterns.md
中间件middleware.md
TypeScripttypescript.md
Slices 模式slices.md
自动选择器auto-selectors.md
重置状态reset-state.md
订阅 APIsubscribe-api.md
测试testing.md
从 v4 迁移到 v5migration-v5.md

最佳实践

  1. 选择器模式 - 始终使用 useStore((s) => s.field) 以提升性能
  2. useShallow - 对数组/对象选择器使用包装器,避免重新渲染
  3. 分离 Store - 每个领域使用一个 Store(auth、cart、ui、theme)
  4. 将服务器数据放在其他位置 - 使用 TanStack Query 管理服务器状态
  5. 仅在开发环境中使用 DevTools - 使用 process.env 检查来包装 devtools
  6. 精简持久化数据 - 只持久化必要字段,绝不持久化令牌

禁用模式

模式原因替代方案
持久化身份验证令牌安全漏洞httpOnly cookies
对象未使用 useShallow过度重新渲染useShallow(selector)
v4 语法TypeScript 类型推断失效v5 柯里化写法 create<T>()()
巨型单体 Store难以维护Slices 或分离 Store

评论

支持 Markdown