mcpField
R
react

react

github.com/thelobbi开发2147 次安装5 天前更新
代码仓库

关于 react

面向现代前端开发的 React 技能,涵盖组件、Hooks、状态管理和 Context API。还提供数据获取、表单处理与性能优化示例。

主要功能

  1. 01组件与组合模式
  2. 02Hooks 与状态管理
  3. 03Context API
  4. 04React Query 数据获取
  5. 05表单验证与处理
  6. 06组件性能优化

适用场景

  1. 01实现 React 组件与自定义 Hooks
  2. 02管理跨组件状态
  3. 03获取数据并提交表单
  4. 04优化列表组件渲染

安装

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

$npx skills add https://github.com/thelobbi/claude --skill react

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

详细介绍

React 技能

为现代前端应用提供全面的 React 开发能力。

何时使用此技能

在以下场景中启用此技能:

  • React 组件开发
  • Hooks 实现
  • 状态管理
  • Context API 用法
  • 组件模式与组合

项目结构

``` src/ ├── components/ │ ├── ui/ │ │ ├── Button.tsx │ │ └── Card.tsx │ └── features/ │ ├── AgentList.tsx │ └── TaskPanel.tsx ├── hooks/ │ ├── useAgent.ts │ └── useTask.ts ├── context/ │ └── AgentContext.tsx ├── services/ │ └── api.ts ├── types/ │ └── index.ts └── App.tsx ```

组件模式

函数组件

```tsx import { FC } from 'react';

interface AgentCardProps { name: string; type: 'claude' | 'gpt' | 'gemini'; status: 'active' | 'idle' | 'error'; onSelect?: () => void; }

export const AgentCard: FC = ({ name, type, status, onSelect }) => { return (

{name}
<span className={status status-${status}}>{status} {type}
); }; ```

自定义 Hooks

```tsx import { useState, useEffect, useCallback } from 'react';

interface Agent { id: string; name: string; status: string; }

export function useAgent(agentId: string) { const [agent, setAgent] = useState<Agent | null>(null); const [loading, setLoading] = useState(true); const [error, setError] = useState<Error | null>(null);

useEffect(() => { const fetchAgent = async () => { try { setLoading(true); const response = await fetch(/api/agents/${agentId}); const data = await response.json(); setAgent(data); } catch (err) { setError(err as Error); } finally { setLoading(false); } };

fetchAgent();

}, [agentId]);

const refresh = useCallback(() => { // 触发重新获取 }, [agentId]);

return { agent, loading, error, refresh }; } ```

Context Provider

```tsx import { createContext, useContext, useReducer, ReactNode } from 'react';

interface AgentState { agents: Agent[]; selectedAgent: Agent | null; }

type AgentAction = | { type: 'SET_AGENTS'; payload: Agent[] } | { type: 'SELECT_AGENT'; payload: Agent } | { type: 'CLEAR_SELECTION' };

const AgentContext = createContext<{ state: AgentState; dispatch: React.Dispatch; } | null>(null);

function agentReducer(state: AgentState, action: AgentAction): AgentState { switch (action.type) { case 'SET_AGENTS': return { ...state, agents: action.payload }; case 'SELECT_AGENT': return { ...state, selectedAgent: action.payload }; case 'CLEAR_SELECTION': return { ...state, selectedAgent: null }; default: return state; } }

export function AgentProvider({ children }: { children: ReactNode }) { const [state, dispatch] = useReducer(agentReducer, { agents: [], selectedAgent: null });

return ( <AgentContext.Provider value={{ state, dispatch }}> {children} </AgentContext.Provider> ); }

export function useAgentContext() { const context = useContext(AgentContext); if (!context) { throw new Error('useAgentContext must be used within AgentProvider'); } return context; } ```

使用 React Query 获取数据

```tsx import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';

export function useAgents() { return useQuery({ queryKey: ['agents'], queryFn: async () => { const response = await fetch('/api/agents'); return response.json(); }, staleTime: 5 * 60 * 1000, // 5 分钟 }); }

export function useCreateAgent() { const queryClient = useQueryClient();

return useMutation({ mutationFn: async (newAgent: CreateAgentInput) => { const response = await fetch('/api/agents', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(newAgent), }); return response.json(); }, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['agents'] }); }, }); } ```

表单处理

```tsx import { useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import { z } from 'zod';

const agentSchema = z.object({ name: z.string().min(1, '名称为必填项'), type: z.enum(['claude', 'gpt', 'gemini']), description: z.string().optional(), });

type AgentFormData = z.infer;

export function AgentForm({ onSubmit }: { onSubmit: (data: AgentFormData) => void }) { const { register, handleSubmit, formState: { errors, isSubmitting }, } = useForm({ resolver: zodResolver(agentSchema), });

return (

<input {...register('name')} placeholder="Agent 名称" /> {errors.name && {errors.name.message}}

  <select {...register('type')}>
    <option value="claude">Claude</option>
    <option value="gpt">GPT</option>
    <option value="gemini">Gemini</option>
  </select>

  <button type="submit" disabled={isSubmitting}>
    创建 Agent
  </button>
</form>

); } ```

性能优化

```tsx import { memo, useMemo, useCallback } from 'react';

// 使用 memo 的组件 export const AgentList = memo(function AgentList({ agents }: { agents: Agent[] }) { const sortedAgents = useMemo( () => [...agents].sort((a, b) => a.name.localeCompare(b.name)), [agents] );

const handleSelect = useCallback((id: string) => { console.log('已选择:', id); }, []);

return (

    {sortedAgents.map((agent) => ( <li key={agent.id} onClick={() => handleSelect(agent.id)}> {agent.name} ))}
); }); ```

评论

支持 Markdown