Agent Skills
› kqcoxn/MaaPipelineEditor
› zustand-store-ts
zustand-store-ts
GitHub提供基于TypeScript的Zustand状态管理最佳实践,包括subscribeWithSelector中间件、状态与动作分离及性能优化选择器模式,用于构建React全局状态。
Trigger Scenarios
创建Zustand store
React状态管理
实现响应式状态模式
Install
npx skills add kqcoxn/MaaPipelineEditor --skill zustand-store-ts -g -y
SKILL.md
Frontmatter
{
"name": "zustand-store-ts",
"license": "MIT",
"metadata": {
"author": "Microsoft",
"version": "1.0.0"
},
"description": "Create Zustand stores with TypeScript, subscribeWithSelector middleware, and proper state\/action separation. Use when building React state management, creating global stores, or implementing reactive state patterns with Zustand."
}
Zustand Store
Create Zustand stores following established patterns with proper TypeScript types and middleware.
Website: https://zustand.nodejs.cn/docs/getting-started/introduction
Quick Start
Copy the template from assets/template.ts and replace placeholders:
{{StoreName}}→ PascalCase store name (e.g.,Project){{description}}→ Brief description for JSDoc
Always Use subscribeWithSelector
import { create } from "zustand";
import { subscribeWithSelector } from "zustand/middleware";
export const useMyStore = create<MyStore>()(
subscribeWithSelector((set, get) => ({
// state and actions
})),
);
Separate State and Actions
export interface MyState {
items: Item[];
isLoading: boolean;
}
export interface MyActions {
addItem: (item: Item) => void;
loadItems: () => Promise<void>;
}
export type MyStore = MyState & MyActions;
Use Individual Selectors
// Good - only re-renders when `items` changes
const items = useMyStore((state) => state.items);
// Avoid - re-renders on any state change
const { items, isLoading } = useMyStore();
Subscribe Outside React
useMyStore.subscribe(
(state) => state.selectedId,
(selectedId) => console.log("Selected:", selectedId),
);
Integration Steps
- Create store in
src/frontend/src/store/ - Export from
src/frontend/src/store/index.ts - Add tests in
src/frontend/src/store/*.test.ts
Version History
- 9875bea Current 2026-07-24 22:31


