react-skills
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseReact Skills for LlamaFarm Designer
面向LlamaFarm Designer的React技能指南
Best practices and patterns for React 18 development in the Designer subsystem.
Designer子系统中React 18开发的最佳实践与模式。
Tech Stack
技术栈
- React 18.2 with StrictMode
- TypeScript 5.2+ for type safety
- TanStack Query v5 for server state management
- React Router v7 for client-side routing
- TailwindCSS with and
tailwind-mergefor stylingclsx - Radix UI primitives for accessible components
- Vite for build tooling
- Vitest + React Testing Library for testing
- React 18.2(搭配StrictMode)
- TypeScript 5.2+(保障类型安全)
- TanStack Query v5(服务端状态管理)
- React Router v7(客户端路由)
- TailwindCSS(结合和
tailwind-merge实现样式)clsx - Radix UI(可访问性组件基础库)
- Vite(构建工具)
- Vitest + React Testing Library(测试框架)
Directory Structure
目录结构
designer/src/
api/ # API service functions
components/ # React components (feature-organized)
contexts/ # React context providers
hooks/ # Custom hooks
lib/ # Utility functions (cn, etc.)
types/ # TypeScript type definitions
utils/ # Helper functions
test/ # Test utilities and mocksdesigner/src/
api/ # API服务函数
components/ # React组件(按功能模块组织)
contexts/ # React Context提供者
hooks/ # 自定义Hooks
lib/ # 工具函数(如cn等)
types/ # TypeScript类型定义
utils/ # 辅助函数
test/ # 测试工具与模拟数据Core Patterns
核心模式
Component Composition
组件组合
- Use composition over inheritance
- Prefer small, focused components
- Use for components that wrap DOM elements
forwardRef - Apply to forwardRef components for DevTools
displayName
- 优先使用组合而非继承
- 推荐小巧、职责单一的组件
- 包裹DOM元素的组件使用
forwardRef - 为forwardRef组件设置,便于DevTools调试
displayName
State Management
状态管理
- Local UI state: ,
useStateuseReducer - Server state: TanStack Query (,
useQuery)useMutation - Shared UI state: React Context with custom hooks
- Form state: Controlled components with validation
- 本地UI状态:、
useStateuseReducer - 服务端状态:TanStack Query(、
useQuery)useMutation - 共享UI状态:结合自定义Hooks的React Context
- 表单状态:带验证的受控组件
Hooks
Hooks
- Follow Rules of Hooks (top-level, consistent order)
- Create custom hooks for reusable logic
- Use query key factories for TanStack Query
- Memoize expensive computations with
useMemo - Stabilize callbacks with
useCallback
- 遵循Hooks规则(顶层调用、顺序一致)
- 封装可复用逻辑为自定义Hooks
- 为TanStack Query使用查询键工厂模式
- 用缓存昂贵计算结果
useMemo - 用稳定回调函数
useCallback
Styling
样式处理
- Use from
cn()to merge Tailwind classeslib/utils - Use (class-variance-authority) for component variants
cva - Follow dark mode conventions with prefix
dark:
- 使用中的
lib/utils合并Tailwind类名cn() - 用(class-variance-authority)实现组件变体
cva - 遵循暗黑模式约定,使用前缀
dark:
Related Guides
相关指南
- components.md - Component patterns
- hooks.md - Hook patterns and rules
- state.md - State management patterns
- performance.md - Performance optimization
- security.md - Security best practices
- components.md - 组件设计模式
- hooks.md - Hooks模式与规则
- state.md - 状态管理模式
- performance.md - 性能优化方案
- security.md - 安全最佳实践
Quick Reference
快速参考
typescript
// Utility for merging Tailwind classes
import { cn } from '@/lib/utils'
cn('base-class', condition && 'conditional-class', className)
// Query key factory pattern
export const projectKeys = {
all: ['projects'] as const,
lists: () => [...projectKeys.all, 'list'] as const,
list: (ns: string) => [...projectKeys.lists(), ns] as const,
}
// Context with validation hook
const MyContext = createContext<MyContextType | undefined>(undefined)
export function useMyContext() {
const ctx = useContext(MyContext)
if (!ctx) throw new Error('useMyContext must be within MyProvider')
return ctx
}typescript
// 合并Tailwind类名的工具函数
import { cn } from '@/lib/utils'
cn('base-class', condition && 'conditional-class', className)
// 查询键工厂模式
export const projectKeys = {
all: ['projects'] as const,
lists: () => [...projectKeys.all, 'list'] as const,
list: (ns: string) => [...projectKeys.lists(), ns] as const,
}
// 带验证的Context Hook
const MyContext = createContext<MyContextType | undefined>(undefined)
export function useMyContext() {
const ctx = useContext(MyContext)
if (!ctx) throw new Error('useMyContext必须在MyProvider范围内使用')
return ctx
}Testing
测试示例
typescript
import { renderWithProviders } from '@/test/utils'
import { screen } from '@testing-library/react'
test('renders component', () => {
renderWithProviders(<MyComponent />)
expect(screen.getByText('Hello')).toBeInTheDocument()
})typescript
import { renderWithProviders } from '@/test/utils'
import { screen } from '@testing-library/react'
test('渲染组件', () => {
renderWithProviders(<MyComponent />)
expect(screen.getByText('Hello')).toBeInTheDocument()
})