React Engineering 是一套关于现代 React 模式与最佳实践的技能,目标是帮助开发者构建高质量、可维护且性能良好的 React 应用。
一、核心原则 技能首先确立若干核心原则:组合优于继承,用组件来构建;单向数据流,props 向下传递、事件向上传递;声明式 UI,描述“做什么”而非“怎么做”;单一职责,一个组件只做一件事;不可变性,不要直接修改 state;副作用隔离,将副作用限制在受控范围内。
二、组件模式 技能给出三种组件模式。第一,始终使用函数组件,而非类组件。第二,组件组合,将复杂组件拆分为更小的组件,例如把 PostCard 拆成 PostHeader、PostContent、PostFooter,避免单体式组件。第三,Props 接口,使用 TypeScript 显式定义 props 类型,例如 ButtonProps 包含 children、onClick、variant、disabled,并给出带完整类型安全的使用示例。
三、状态管理 技能介绍三种状态管理模式。useState 用于局部组件状态,并强调派生状态应使用函数式更新(setCount((prev) => prev + 1)),避免使用可能过期的 state。useReducer 用于复杂状态逻辑,示例定义了 State、Action 联合类型以及 reducer 函数,并通过 dispatch 触发更新。Context 用于共享状态,示例创建 ThemeContext、ThemeProvider 组件和 useTheme 自定义 Hook,并在 App 中包裹使用。
四、副作用与 Effect 技能给出 useEffect 的三种模式。基础用法:在 userId 变化时获取用户数据,并说明依赖数组的作用。清理函数:在 WebSocket 组件中,effect 返回清理函数以关闭连接,空依赖数组表示仅在挂载时运行一次。避免 Effect 瀑布:不要在一个 effect 中等待另一个 effect 的结果,而应使用 Promise.all 并行获取数据。
五、自定义 Hook 技能展示如何抽取可复用逻辑。useInput 封装表单输入的值、onChange 和 reset,并在 LoginForm 中使用。useFetch 封装数据获取,返回 data、loading、error,并通过 cancelled 标志避免组件卸载后更新状态,示例在 Posts 组件中使用。
六、性能优化 技能列出四种优化手段。useMemo 缓存昂贵计算,例如根据 products 和 filter 计算 filteredProducts。useCallback 缓存回调函数,避免子组件不必要的重渲染。React.memo 在 props 变化时才重新渲染组件。代码分割使用 lazy 与 Suspense 懒加载 Dashboard、Settings 等组件。
七、列表与 key 技能强调使用稳定唯一的 ID 作为 key,不要使用数组索引(重排序时不稳定),也不要使用随机值。
八、表单 技能介绍受控组件模式,使用 useState 保存 formData,通过 handleChange 统一处理输入变化,并在 handleSubmit 中阻止默认行为后提交。
九、错误边界 技能给出基于类组件的 ErrorBoundary 实现,包含 getDerivedStateFromError、componentDidCatch 和 fallback 渲染,并展示其使用方式。
十、最佳实践 技能建议组件按固定顺序组织:导入、类型/接口、组件、Hooks、事件处理器、提前返回、渲染。命名约定方面:组件用 PascalCase,Hook 用 camelCase 且以 use 开头,事件处理器用 handle 前缀,props 使用描述性名称。对于 prop drilling,建议使用 Context 替代多层传递。
十一、常见反模式 技能列出应避免的做法:直接修改 state、在动态列表中使用索引作为 key、在渲染中放置副作用、在组件内部创建组件、忘记在 useEffect 中清理、未加 memo 就传递内联函数作为 props。对应的正确做法是:使用不可变更新、使用稳定唯一 key、用 useEffect 处理副作用、在模块层级定义组件、返回清理函数、对传给子组件的回调进行 memo 化。
十二、延伸阅读 技能提供三个参考链接:React 官方文档 https://react.dev/ 、React TypeScript Cheatsheet https://react-typescript-cheatsheet.netlify.app/ 、Patterns.dev https://www.patterns.dev/ 。
关于该技能的安装方式、收费情况、支持平台等具体信息,资料中暂未提供。