React

Polar Sponsor
爱发电 赞助
.NET 9.0

React 19完整工程化:架构设计、服务端组件、Hooks、Zustand、TanStack Query、表单处理、性能优化、测试与生产部署。

React

功能概述

React是一项面向实际任务的技能,主要用于Production- 级 React 工程. 这种技能会改变您构建 React 应用程序的方式—— 从组件架构到部署.;构建 React 组件、 页面或 fea。

核心要点

  • 它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。
  • 使用时应结合输入条件选择合适的执行方式,核对必要参数、依赖环境与输出内容,并按原始要求处理异常情况。
  • 该技能适合需要稳定复用相关能力的场景,可作为自动化工作流的一部分,也便于后续检查、调整和扩展。

使用与执行

从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;

结果检查与注意事项

若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。

React

面向生产环境的 React 工程实践。该技能将彻底改变你构建 React 应用的方式——从组件架构到部署全流程。

适用场景

  • 构建 React 组件、页面或功能模块
  • 实现状态管理(useState、Context、Zustand、TanStack Query)
  • 使用 React 19(服务端组件、use()、Actions)
  • 性能优化(memo、lazy、Suspense)
  • 调试渲染问题、无限循环、闭包过期等
  • 搭建项目架构与目录结构

架构决策

编写代码前,请先明确以下决策:

决策项 可选方案 默认值
渲染方式 SPA / SSR / 静态生成 / 混合渲染 SSR(Next.js)
服务端状态 TanStack Query / SWR / use() TanStack Query
客户端状态 useState / Zustand / Jotai 若需跨组件共享则使用 Zustand
样式方案 Tailwind / CSS Modules / styled Tailwind
表单处理 React Hook Form + Zod / 原生表单 RHF + Zod

规则:服务端状态(API 数据)与客户端状态(UI 状态)是完全不同的两类状态,严禁混用。

组件规范

// ✅ 正确模式
export function UserCard({ user, onEdit }: UserCardProps) {
  // 1. Hook 声明置于最前(始终如此)
  const [isOpen, setIsOpen] = useState(false)
  
  // 2. 衍生状态(禁止使用 useEffect 计算)
  const fullName = `${user.firstName} ${user.lastName}`
  
  // 3. 事件处理器
  const handleEdit = useCallback(() => onEdit(user.id), [onEdit, user.id])
  
  // 4. 提前返回
  if (!user) return null
  
  // 5. JSX(最多 50 行)
  return (...)
}
规则 原因
仅使用具名导出(named exports) 保障重构安全性,提升 IDE 支持度
导出 Props 接口 便于复用,具备类型文档能力
JSX 最多 50 行 超出则拆分为子组件
单文件最多 300 行 按职责拆分为多个组件
Hook 声明统一置于顶部 符合 React 规则,逻辑更可预测

状态管理

是否来自 API?
├─ 是 → 使用 TanStack Query(禁止使用 Redux 或 Zustand)
└─ 否 → 是否在多个组件间共享?
    ├─ 是 → 使用 Zustand(简单场景)或 Context(变更频率极低时)
    └─ 否 → 使用 useState

TanStack Query(服务端状态)

// 查询键工厂 —— 防止拼写错误
export const userKeys = {
  all: ['users'] as const,
  detail: (id: string) => [...userKeys.all, id] as const,
}

export function useUser(id: string) {
  return useQuery({
    queryKey: userKeys.detail(id),
    queryFn: () => fetchUser(id),
    staleTime: 5 * 60 * 1000, // 5 分钟
  })
}

Zustand(客户端状态)

// 轻量级 Store,每个 Store 关注单一职责
export const useUIStore = create()((set) => ({
  sidebarOpen: true,
  toggleSidebar: () => set((s) => ({ sidebarOpen: !s.sidebarOpen })),
}))

// 务必使用 selector —— 避免不必要的重渲染
const isOpen = useUIStore((s) => s.sidebarOpen)

React 19

服务端组件(Next.js App Router 默认启用)

// 服务端组件 —— 在服务端执行,零 JS 下发至客户端
async function ProductList() {
  const products = await db.products.findMany() // 直接访问数据库
  return 
    {products.map(p => )}
} // 客户端组件 —— 必须添加 'use client' 指令 'use client' function AddToCartButton({ productId }: { productId: string }) { const [loading, setLoading] = useState(false) return }
服务端组件 客户端组件
支持 async/await ✅ 支持 useState ✅
支持直接数据库访问 ✅ 支持 onClick ✅
不增加打包体积 增加打包体积
不支持 useState ❌ 不支持 async ❌

use() Hook

// 在渲染中读取 Promise(配合 Suspense)
function Comments({ promise }: { promise: Promise }) {
  const comments = use(promise) // 暂停渲染直至 Promise 解析完成
  return 
    {comments.map(c =>
  • {c.text}
  • )}
}

useActionState(表单)

'use client'
async function submitAction(prev: State, formData: FormData) {
  'use server'
  // ... 服务端逻辑
  return { success: true }
}

function Form() {
  const [state, action, pending] = useActionState(submitAction, {})
  return (
    
{state.error &&

{state.error}

}
) }

性能优化

优先级 技术手段 影响程度
P0 基于路由的代码分割 🔴 高
P0 图片优化(next/image) 🔴 高
P1 长列表虚拟化(tanstack-virtual) 🟡 中
P1 防抖昂贵操作 🟡 中
P2 对昂贵组件使用 React.memo 🟢 低–中
P2 对昂贵计算使用 useMemo 🟢 低–中

React Compiler(React 19+):自动 memo 化。请移除所有手动的 memo/useMemo/useCallback。

常见陷阱

渲染陷阱

// ❌ 当 count 为 0 时渲染字符串 "0"
{count && }

// ✅ 显式布尔判断
{count > 0 && }
// ❌ 直接修改原数组 —— React 无法检测到变化
array.push(item)
setArray(array)

// ✅ 创建新引用
setArray([...array, item])
// ❌ 每次渲染都生成新 key —— 导致组件被销毁重建


// ✅ 使用稳定 key

Hook 陷阱

// ❌ useEffect 不支持异步函数
useEffect(async () => { ... }, [])

// ✅ 在内部定义并调用异步函数
useEffect(() => {
  async function load() { ... }
  load()
}, [])
// ❌ 缺少清理逻辑 —— 可能导致内存泄漏
useEffect(() => {
  const sub = subscribe()
}, [])

// ✅ 返回清理函数
useEffect(() => {
  const sub = subscribe()
  return () => sub.unsubscribe()
}, [])
// ❌ 将对象放入依赖数组 —— 每次渲染都会触发
useEffect(() => { ... }, [{ id: 1 }])

// ✅ 提取基础类型或使用 memoize
useEffect(() => { ... }, [id])

数据获取陷阱

// ❌ 串行请求 —— 性能差
const users = await fetchUsers()
const orders = await fetchOrders()

// ✅ 并行请求
const [users, orders] = await Promise.all([fetchUsers(), fetchOrders()])
// ❌ 竞态条件 —— 无中止机制
useEffect(() => {
  fetch(url).then(setData)
}, [url])

// ✅ 使用 AbortController
useEffect(() => {
  const controller = new AbortController()
  fetch(url, { signal: controller.signal }).then(setData)
  return () => controller.abort()
}, [url])

AI 易犯错误(需规避)

AI 助手在 React 开发中常犯的典型错误:

错误 正确模式
用 useEffect 计算衍生状态 内联计算:const x = a + b
用 Redux 管理 API 数据 服务端状态统一使用 TanStack Query
使用默认导出(default export) 仅使用具名导出:export function X
动态列表中用 index 作 key 使用稳定 ID:key={item.id}
在 useEffect 中发起数据请求 应使用 TanStack Query 或 loader 模式
巨型组件(500+ 行) JSX 超过 50 行或文件超 300 行即拆分
未设置错误边界(Error Boundary) 在应用层、功能模块层、组件层均需添加
忽略 TypeScript 严格模式 启用 strict: true 并修复全部类型错误

速查手册

常用 Hook

Hook 用途
useState 本地状态
useEffect 副作用(订阅、DOM 操作等)
useCallback 保持函数引用稳定
useMemo 缓存昂贵计算结果
useRef 可变引用,用于 DOM 访问等
use() 读取 Promise 或 Context(React 19)
useActionState 表单动作状态(React 19)
useOptimistic 乐观 UI(React 19)

推荐目录结构

src/
├── app/                 # 路由(Next.js)
├── features/            # 功能模块
│   └── auth/
│       ├── components/  # 功能相关组件
│       ├── hooks/       # 功能相关 Hook
│       ├── api/         # API 请求封装
│       └── index.ts     # 公共导出入口
├── shared/              # 跨功能复用
│   ├── components/ui/   # Button、Input 等通用组件
│   └── hooks/           # useDebounce 等通用 Hook
└── providers/           # Context Provider

初始化配置

首次配置请参阅 setup.md。项目跟踪使用 memory-template.md。

核心规则

  1. 服务端状态 ≠ 客户端状态 —— API 数据交由 TanStack Query 管理,UI 状态使用 useState/Zustand;二者严禁混用。
  2. 仅使用具名导出 —— 使用 export function X,禁止 export default;保障安全重构能力。
  3. 先就近共置,再按需提升 —— 初始将状态放在使用处附近;仅当多处需要时才提取提升。
  4. 禁止用 useEffect 计算衍生状态 —— 应内联计算:const total = items.reduce(...);useEffect 仅用于副作用。
  5. 始终使用稳定 key —— 动态列表必须使用 item.id,禁止使用 index。
  6. JSX 最多 50 行 —— 超出即拆分为子组件;单文件上限为 300 行。
  7. TypeScript 启用 strict: true —— 禁止使用 any,禁用隐式 null/undefined;在编译期捕获类型错误。

关联技能

如用户确认,可通过 clawhub install 安装:

  • frontend-design-ultimate —— 使用 React + Tailwind 构建完整 UI
  • typescript —— TypeScript 最佳实践与严格配置
  • nextjs —— Next.js App Router 与部署实践
  • testing —— 使用 Testing Library 测试 React 组件

反馈

  • 若本技能有用:clawhub star react
  • 保持更新:clawhub sync

相关专题

更多
JavaScript React组件优化与性能提升实战
JavaScript React组件优化与性能提升实战

本专题围绕 React 框架在大型前端项目中的性能优化展开,讲解组件生命周期优化、虚拟 DOM 原理、状态管理策略及懒加载技术。通过实战案例,帮助开发者构建性能优良、响应迅速的前端应用。

2026.04.13

165

18

React 18状态管理与Hooks高级实践
React 18状态管理与Hooks高级实践

本专题专注于 React 18 的高级开发技术,详细讲解 useState、useEffect、useReducer、useContext 等 Hooks 的使用技巧,以及 Redux、Zustand 等状态管理工具的集成与优化方法。通过真实案例,帮助前端开发者构建可维护、性能优良的现代 React 应用。

2026.02.10

183

17

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

2026.10.22

0

11

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

2026.10.22

0

10

Golangci-lint检查器使用教程
Golangci-lint检查器使用教程

本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。

2026.10.22

0

15

Gradle怎么构建Java项目
Gradle怎么构建Java项目

本专题介绍Gradle Java项目构建方法,涵盖Java插件配置、依赖声明、源码编译、测试执行和打包检查,帮助你理解各阶段的任务关系,逐步完成项目构建。

2026.10.22

0

10

PHP时间戳漏洞修复教程
PHP时间戳漏洞修复教程

本专题汇总PHP常见时间戳漏洞,包括2038年溢出、时区漂移、时间戳伪造、重放攻击、时间盲注与日志审计失效等,并给出升级64位环境、使用 DateTimeImmutable、统一UTC、严格超时校验、预处理绑定、hash_equals 比对等修复方案,帮助开发者快速排查和加固时间相关代码。

2026.10.22

0

25

Golangci-lint配置文件与规则设置
Golangci-lint配置文件与规则设置

本专题聚焦Golangci-lint YAML配置文件,讲清运行参数、规则启停、目录排除、问题过滤及严重级别设置,便于团队统一检查标准。

2026.10.22

0

15

Golangci-lint安装与入门教程
Golangci-lint安装与入门教程

本专题讲解Golangci-lint的安装、初始化、基础命令和首次代码检查,覆盖本地环境、Docker及多平台用法,帮助Go开发者快速上手。

2026.10.22

0

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 12.3万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1.4万人学习