Ziptax Tool Free
支持按地址、邮编或经纬度查询美国销售税率,含CLI封装与API调用说明。
基于 React 的架构模式、TypeScript、Next.js 及 Hooks,适用于组件结构、状态管理、路由配置、测试等场景。
openclaw skills install @iliaal/compound-eng-react-frontend命令、参数、文件名以原文为准
实施前请验证:对于 App Router 模式、React 19 API 或版本特定行为,请在编写代码前查阅最新文档(如有 Context7 query-docs,否则通过网络搜索访问框架官方文档)。训练数据可能滞后于最新发布版本。
ComponentPropsWithoutRef<'button'> 扩展原生元素,并通过交叉类型添加自定义属性React.ReactNode,单个元素使用 React.ReactElement,渲染函数使用 (data: T) => ReactNode<T> 配合 keyof T 表示列键,T extends { id: string } 用于约束React.MouseEvent<HTMLButtonElement>、FormEvent<HTMLFormElement>、ChangeEvent<HTMLInputElement>as const 标记自定义 Hook 返回的元组useRef<HTMLInputElement>(null) 用于 DOM 引用(使用 ?. 安全访问),useRef<number>(0) 用于可变值useState<User | null>(null) 处理联合类型或空值useReducer 动作使用区分联合类型:{ type: 'set'; payload: number } | { type: 'reset' }useContext 空值保护:在自定义 useX() Hook 中,若上下文为 null 则抛出异常Effects 是逃逸机制——大多数逻辑不应使用 Effects。
| 需求 | 解决方案 |
|---|---|
| 从 props/state 推导出的值 | 在渲染期间计算(如开销大则使用 useMemo) |
| prop 变化时重置状态 | 通过组件的 key 属性实现 |
| 响应用户事件 | 事件处理器 |
| 通知父组件状态变化 | 在事件处理器中调用 onChange,或使用完全受控组件 |
| 状态更新链 | 在一个事件处理器中一次性计算所有下一状态 |
| 与外部系统同步 | 使用带清理函数的 Effect |
Effect 规则:
setItems(prev => [...prev, item]))以避免依赖项问题useEffectEventAbortController 用于 fetch;ignore 标志用于不可取消的 Promise;React Query 自动处理两者共有五类竞态在类型检查和单元测试中存活——审查时需重点排查(清理/取消机制参考上述 Effect 规则):
| 类别 | 生产环境信号 | 修复方式 |
|---|---|---|
| 生命周期清理间隙 | “在已卸载组件上更新状态”警告,快速导航下的内存泄漏 | 每个注册监听器/定时器/观察者的 Effect 必须返回清理函数 |
| 重新挂载时机错误 | 异步回调在路由切换/卸载后修改状态/DOM(如 fetch().then(setData) 在导航后才 resolve) | 按取消层级进行取消操作 |
| 非二元 UI 的布尔状态 | 矛盾组合(如 isLoading: true, error: Error) | 使用状态常量(`'idle' \ |
| 过期的 Promise/定时器,无取消路径 | Promise 链或 setTimeout 在组件离开后仍持有 setState | 为每个异步操作绑定取消机制;测试清理路径 |
| 大列表中每项的事件处理器 | 每行产生多个闭包/订阅,快速重渲染时出现过期闭包问题 | 采用委托:仅父级设置一个处理器 + 使用 event.target.closest(...),当项目数超过 ~50 或更新频繁时适用 |
本地 UI 状态 → useState, useReducer
共享客户端状态 → Zustand(简单) | Redux Toolkit(复杂)
原子化/细粒度状态 → Jotai
服务器/远程数据 → React Query(TanStack Query)
URL 状态 → nuqs, router search params
表单状态 → React Hook Form关键模式:
create<State>()(devtools(persist((set) => ({...})))) —— 使用 slices 分片管理规模;选择性订阅防止不必要的重渲染['users', 'detail', id] as const)、staleTime/gcTime、乐观更新配合 onMutate/onError 回滚关键 —— 消除瀑布流:
Promise.all()await 移至实际需要的位置关键 —— 包体积优化:
index.ts 的重新导出)next/dynamic 或 React.lazy()content-visibility: auto + contain-intrinsic-size —— 跳过屏幕外布局/绘制重渲染优化:
state.items.length > 0 而非 state.items)setCount(c => c + 1)useState(() => expensiveComputation())useTransition(如搜索过滤)useDeferredValuesearchParams/state——按需读取condition ? <A /> : <B />),而非 &&React.memo 仅用于具有稳定 props 的昂贵子树React Compiler(React 19):自动记忆化——编写惯用 React 代码,移除手动 useMemo/useCallback/memo。通过 reactCompiler: true 在 next.config 中启用(非框架项目使用 babel-plugin-react-compiler)。保持组件纯净。
forwardRef 已弃用。直接接受 ref?: React.Ref<HTMLElement> 作为常规属性useFormState:const [state, formAction, isPending] = useActionState(action, initialState)const [optimistic, addOptimistic] = useOptimistic(state, mergeFn) 实现即时 UI 反馈<form action={...}> 的子组件中使用:const { pending } = useFormStatus()'use server' 指令。输入验证(如 Zod),revalidateTag/revalidatePath 在变更后触发。服务端动作是公开端点——必须在每个动作内部验证身份认证与授权,不能仅依赖中间件或布局守卫<Activity mode='visible'|'hidden'>** —— 保留切换组件的状态与 DOM(实验性)文件约定:
page.tsx(路由界面)、layout.tsx(共享包装器)、template.tsx(导航时重新挂载,不同于 layout)、loading.tsx(Suspense)、error.tsx(错误边界)、not-found.tsx(404)、default.tsx(并行路由默认回退)、route.ts(API 端点)
渲染模式: 服务端组件(默认)|客户端('use client')|静态(构建时)|动态(请求时)|流式(渐进式)
决策原则: 除非需要 Hooks、事件处理器或浏览器 API,否则使用服务端组件。拆分:服务端父组件 + 客户端子组件。将交互式组件隔离为 'use client' 叶子组件——保持服务端组件静态,无全局状态或事件处理器。
服务端 → 客户端边界: 仅传递客户端组件实际使用的字段,而非整个 ORM 行或 fetch 对象。每个跨 'use client' 边界的 prop 都会被序列化为负载,因此即使只用一个字段,50 字段的 user 对象也会传输全部 50 个字段。
路由模式:
(name) —— 组织结构但不影响 URL@slot —— 同一布局中独立加载状态(.) —— 模态覆盖层,带完整页面回退缓存策略:
fetch(url, { cache: 'force-cache' }) —— 静态缓存fetch(url, { next: { revalidate: 60 } }) —— ISR(增量静态再生)fetch(url, { cache: 'no-store' }) —— 动态请求fetch(url, { next: { tags: ['products'] } }) 后调用 revalidateTag('products')数据获取:
React.cache() 实现每请求去重generateStaticParams 进行静态生成generateMetadata 实现动态 SEOtitle: { default: 'App', template: '%s | App' } 实现页面标题级联after() 执行非阻塞副作用(如日志、分析)——在响应发送后运行*.test.tsx。React 组件的默认测试方式renderHook + act,同名 *.test.tsgetByRole > getByLabelText > getByPlaceholderText > getByText > getByTestIdshould <行为> when <条件>userEvent 而非 fireEvent,以模拟真实交互findBy*,对状态触发操作后使用 waitForbeforeEach 中使用 vi.clearAllMocks(),每次测试重建状态关于 Tailwind v4 配置、实用类模式、暗色模式及组件变体,请参考 [ia-tailwind-css](../ia-tailwind-css/SKILL.md) 技能。
JSX 中的类名排序:保持 Tailwind 类名按标准顺序排列(可通过 eslint-plugin-better-tailwindcss 强制执行)。
eslint-disable、@ts-ignore)useEffect 依赖数组未被手动覆盖forwardRef 使用(应直接使用 ref 属性)已收录 3 个 Skill