tech-react 是 ravnhq/ai-toolkit 中一个聚焦 React 19 的开发技能,用于指导 React 组件、Hooks、Server Components 与数据获取的编写方式。资料说明,React 模式会随主版本演进,React 19 引入了用于处理 Promise 的 use() 钩子,并以更清晰的客户端/服务端语义规范化了 Server Component 边界。
【用途】 该技能用于编写 React 组件、使用 Hooks 管理状态,以及实现相关数据获取逻辑。从给出的触发示例看,它适用于将现有 React 组件重构以减少重渲染、梳理 Hook 使用方式,以及把客户端 useEffect 数据获取改为 Server Components 方案等场景。
【主要能力】 资料列出了它关注的一系列常见问题:Hook 顺序违规(条件性调用 Hook 会破坏 React 的追踪机制);不必要的 memoization(在未测量前使用 useMemo/useCallback/React.memo 会带来额外开销);组件过大(混用 Server 与 Client 逻辑会妨碍流式优化);缺少 Suspense 边界(异步数据未配合 Suspense 会阻塞整次渲染);过期闭包(Effect 依赖数组不正确或缺少清理);key 误用(用索引作 key 会导致重排序后状态附着到错误的列表项)。React 19 对应的改进包括:用 use() 消费 Promise、用 Server Components 获取数据而无需额外请求、用 useTransition() 进行非阻塞更新。
【使用方式】 资料给出的工作流为:1) 明确组件职责,判断组件应是 Server(偏数据)还是 Client(偏交互);2) 在顶层定义 Hooks,所有 Hooks 必须在任何 return 之前无条件执行;3) 对异步使用 Suspense,将 use() 调用包裹在 Suspense 边界内以提供加载回退;4) 以 key 进行组合,列表项使用稳定且唯一的 key,并可用 key 属性重置组件状态;5) 优化前先测量,在添加 memoization 前用 React DevTools 做性能分析;6) 清理订阅,对订阅系统的 Effect 始终返回清理函数;7) 保持组件小颗粒,把交互部分抽成 Client Component,由 Server Component 负责数据。规则细节可参见其 rules 索引。
【适用场景与示例】 资料给出两个正向触发示例:一是“重构这个 React 组件,减少重渲染并理清 Hook 用法”,期望行为是按 tech-react 指引与工作流给出可执行输出;二是“我现在用 useEffect 在客户端获取数据,如何用 Server Components 重构”,期望行为是把数据获取移到 Server Component,通过 use() 钩子把 Promise 传给 Client Component,并用 Suspense 边界包裹。反向触发示例是“写一个 Bash 脚本打包发布产物”,此时不应优先使用 tech-react,而应选择更相关的技能或不使用它。
【限制与排查】 资料针对若干问题给出排查方向:Hook 调用违规(报错“Rendered fewer/more hooks than during the previous render”,原因是条件、循环或提前 return 中调用 Hook,解决方式是把 Hook 调用移到任何条件逻辑之前,并在数据 Hook 中使用 enabled 选项跳过执行);Suspense 回退不显示(原因是 Suspense 边界未包裹调用 use() 的组件,应确保 <Suspense> 是该组件的父级而非兄弟);Server Component 无法使用状态/事件(原因是 Server Component 仅在服务端渲染一次,无法响应客户端交互,应把交互部分抽到带 "use client" 指令的 Client Component,由 Server Component 负责取数并传递);useEffect 重复执行或内存泄漏(原因是缺少依赖数组或缺少清理返回函数,应包含依赖数组并为订阅/定时器/监听器返回清理函数);列表项丢失焦点或顺序错乱(原因是使用数组索引作 key,应改为使用数据中唯一属性如 key={item.id})。
资料还列出三类错误模式及正确写法:条件调用 Hook(应先调用 Hook 再提前 return);Suspense 未配合 use()(应在 Suspense 中用 use(commentsPromise) 替代 useEffect 中的 fetch 后 setState);Server/Client 边界混淆(Server Component 中不能使用 useState,应拆出 "use client" 的 NotesList 处理选中交互)。
安装命令、收费与价格信息在资料中暂未提供。