mcpField
R
react-state

react-state

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

关于 react-state

帮助开发者在 React 应用中实现 Zustand v5 全局状态管理的技能,适用于组织共享客户端状态。内容涵盖类型安全的 Store 创建、选择器用法和中间件组合。

主要功能

  1. 01Zustand v5 柯里化 Store 创建
  2. 02基于选择器访问状态
  3. 03用 useShallow 处理数组和对象选择器
  4. 04组合 devtools、persist 与 immer 中间件
  5. 05按领域组织 Store
  6. 06面向 TypeScript 的文件结构

适用场景

  1. 01在 React 组件间设置共享状态
  2. 02组织认证、购物车、UI 和主题 Store
  3. 03减少数组或对象选择器引起的重渲染
  4. 04组合适用于 TypeScript 的中间件

安装

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

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

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

详细介绍

为 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 token、v4 语法、跳过 useShallow)。这是 Zustand 的纯 React 版本(没有 App Router 请求隔离方面的顾虑)——Next.js App Router 请参阅 nextjs-zustand;服务端状态则请使用 TanStack Query,而不是此技能。

Zustand for React

使用 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,无需 shim
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(theme、ui)
  • modules/auth/src/stores/ - Auth 状态
  • modules/cart/src/stores/ - Cart 状态
  • modules/[feature]/src/interfaces/ - Store 类型
文件组织
文件用途
store.ts使用 create() 创建 store(最多 40 行,owner 规则)
store.interface.tsTypeScript 接口
use-store.ts带选择器的自定义 Hook

核心概念

创建 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
Subscribe 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. 对 persist 使用 Partialize - 仅持久化必要字段,绝不持久化令牌

禁止的模式

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

评论

支持 Markdown