一键导入
frontend-provider-context
Use when creating or modifying Provider Context components for local state management
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Use when creating or modifying Provider Context components for local state management
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
| name | frontend-provider-context |
| description | Use when creating or modifying Provider Context components for local state management |
Standard pattern for React Context providers using class State + useReducer + setState(partial) for page/component-level state management.
import React, { createContext, useReducer } from "react";
class State {
key1: string = "";
key2: boolean = false;
key3: number = 0;
}
const ContextDefault: { state: State; setState: React.Dispatch<Partial<State>> } = {
state: new State(),
setState: () => {},
};
const Reducer = (state: State, partial: Partial<State>): State => ({ ...state, ...partial });
const Context = createContext(ContextDefault);
export const Provider_[Name] = ({ children }: { children: React.ReactNode }) => {
const [state, setState] = useReducer(Reducer, new State());
return <Context.Provider value={{ state, setState }}>{children}</Context.Provider>;
};
export const useProvider_[Name] = () => React.useContext(Context);
Partial<State> for setState, no-op prevents crashes outside provider({ ...state, ...partial })useReducer + new State() initializationuseContext(Context) for consuming| Type | Pattern | Example |
|---|---|---|
| Provider | Provider_[Name] | Provider_Page_Set, Provider_Spark_FileBrowserModal |
| Hook | useProvider_[Name] | useProvider_Page_Set |
| Variable | p[Name] (camelCase) | pPageSet, pModal |
// 1. Wrap component tree
<Provider_Page_Set>
<PageContent />
</Provider_Page_Set>
// 2. Use in child components
const pPageSet = useProvider_Page_Set();
pPageSet.setState({ selectedSceneFileId: "123" });
pPageSet.state.selectedSceneFileId;
// Multiple properties
pPageSet.setState({ selectedSceneFileId: "123", selectedSceneId: "456" });
// Toggle
pPageSet.setState({ isLoading: !pPageSet.state.isLoading });
For initializing from props (e.g., route params):
export const Provider_Page_Set = ({
children,
initialState,
}: {
children: React.ReactNode;
initialState?: Partial<State>;
}) => {
const [state, setState] = useReducer(
Reducer,
initialState ? { ...new State(), ...initialState } : new State()
);
return <Context.Provider value={{ state, setState }}>{children}</Context.Provider>;
};
// Usage
<Provider_Page_Set initialState={{ selectedSceneId: sceneId }}>
| Wrong | Correct |
|---|---|
| useState + individual setters | useReducer + setState(partial) |
| Deep nested state objects | Flat state: modalIsOpen, panelIsCollapsed |
| Default exports | Named exports only |
| Custom setter functions per key | Single setState({ key: value }) |
Why useReducer + partial is better:
// Place at page root
export const Page_Set = () => (
<Provider_Page_Set initialState={{ selectedSceneId }}>
<PageSetContent />
</Provider_Page_Set>
);
Use for: State shared across subcomponents, persists across sub-component mounts.
// Place at component root
export const PageSet_Canvas = () => (
<Provider_PageSet_Canvas>
<Canvas><CanvasContent /></Canvas>
</Provider_PageSet_Canvas>
);
Use for: State only needed in subtree, resets on unmount.
| Provider | Location | Purpose |
|---|---|---|
Provider_Page_Set | Page_Set/ | Selected scene/file IDs, placement mode |
Provider_Page_Scene | Page_Scene/ | Scene editor state |
Provider_Spark_FileBrowserModal | components/Spark_FileBrowserModal/ | Modal file selection |
State class with default valuesContextDefault with Partial<State> typeReducer spread mergeProvider_[Name], useProvider_[Name]initialState prop if neededp[Name]Use when deploying Cloudflare Workers, managing R2 storage, or working with Cloudflare infrastructure
Use when working with ANTD components, theme tokens, icons, forms, or feedback components (message/notification/modal)
Use when adding, referencing, or serving static assets (images, fonts, videos, 3D models) through the R2 CDN pipeline with type-safe imports
Use when writing or reviewing JavaScript/TypeScript code for style patterns like concise arrows, inline handlers, expression formatting, or when tempted to use eslint-disable
Use when working with environment variables in frontend code
Use when creating or modifying keyboard shortcuts/hotkeys in frontend code