说明:标题提到的React 19在本文写作时(2023年4月)尚未发布(React 19于2024年发布)。

本文基于我多年React开发的实战经验,以及对React 19新特性的预期,分享那些年我踩过的坑,以及如何避免。

一、我的React经历

1. 从类组件开始

我最早接触React,是类组件时代。

  • 用class定义组件
  • 用this.state管理状态
  • 用生命周期方法
  • 用this绑定
  • 那时候,React还比较简单

类组件,是我React的起点。

2. Hooks的革命

后来,Hooks来了。

  • React 16.8引入Hooks
  • 函数组件也能有状态
  • 代码更简洁
  • 逻辑复用更方便
  • 但也带来了新的坑

Hooks,是React的革命。

3. React 18的并发

再后来,React 18发布了。

  • 并发渲染
  • 自动批处理
  • useTransition
  • 服务端组件
  • 新的特性,新的坑

React 18,改变了开发方式。

4. 对React 19的期待

现在,期待React 19。

  • 服务端组件稳定
  • 新的Hooks
  • 更好的性能
  • 更好的开发体验
  • 但也可能有新的坑

React 19,值得期待,但也要做好准备。

二、那些年踩过的坑

1. 坑一:useEffect的依赖问题

第一个坑:useEffect的依赖问题。

  • 刚开始用useEffect
  • 不知道依赖数组怎么写
  • 经常漏依赖
  • 导致闭包陷阱
  • 数据不更新

例子:

// 错误:缺少依赖
useEffect(() => {
    fetchData(userId);
}, []);  // 缺少userId

解决方法:

  • 仔细检查依赖数组
  • 用ESLint的react-hooks插件
  • 理解闭包
  • 必要时用useRef

这个坑,几乎每个React开发者都踩过。

2. 坑二:无限循环

第二个坑:无限循环。

  • useEffect里setState
  • 依赖是对象或数组
  • 每次渲染都是新引用
  • 导致无限循环
  • 页面卡死

例子:

// 错误:无限循环
useEffect(() => {
    setData({...data, updated: true});
}, [data]);

解决方法:

  • 用useMemo缓存对象
  • 用函数式更新
  • 拆分effect
  • 仔细设计依赖

无限循环,是React开发的噩梦。

3. 坑三:状态更新不及时

第三个坑:状态更新不及时。

  • setState是异步的
  • 以为更新后立即生效
  • 结果读取的是旧值
  • 导致逻辑错误

例子:

// 错误:以为setCount后count立即更新
const handleClick = () => {
    setCount(count + 1);
    console.log(count);  // 还是旧值
};

解决方法:

  • 用函数式更新
  • 用useEffect监听变化
  • 用useRef保存最新值
  • 理解React的渲染机制

状态更新,是React的核心概念。

4. 坑四:不必要的重渲染

第四个坑:不必要的重渲染。

  • 父组件渲染
  • 子组件都跟着渲染
  • 性能很差
  • 大列表尤其明显

解决方法:

  • 用React.memo
  • 用useMemo
  • 用useCallback
  • 大列表用虚拟化

性能优化,是React开发的必修课。

5. 坑五:Context滥用

第五个坑:Context滥用。

  • 什么都往Context里放
  • 导致整个应用重渲染
  • 性能很差
  • 状态管理混乱

解决方法:

  • Context只放真正全局的状态
  • 拆分Context
  • 用useMemo优化Provider的value
  • 考虑用Redux或其他状态管理库

Context,是工具,不是万能的。

6. 坑六:服务端组件的误解

第六个坑:服务端组件的误解。

  • React 18引入服务端组件
  • 以为和SSR一样
  • 以为不能交互
  • 混淆了客户端和服务端
  • 用错了"use client"

解决方法:

  • 仔细阅读官方文档
  • 理解服务端组件的原理
  • 合理划分客户端和服务端
  • 从小项目开始实践

服务端组件,是React的未来,但也容易误解。

三、React 19可能的新坑

1. 新Hooks的坑

React 19可能引入新的Hooks。

  • useFormStatus
  • useOptimistic
  • useActionState
  • 新的Hooks,新的坑
  • 需要学习和适应

新Hooks,要仔细看文档。

2. 服务端组件的坑

服务端组件可能在React 19稳定。

  • 更多人开始用
  • 更多的坑会暴露
  • 客户端和服务端的边界
  • 数据获取的方式
  • 缓存策略

服务端组件,需要时间成熟。

3. 升级的坑

升级到React 19,可能有坑。

  • breaking changes
  • 第三方库不兼容
  • 旧代码需要修改
  • 性能问题
  • 需要充分测试

升级,要谨慎。

4. 新特性的滥用

新特性,可能被滥用。

  • 什么都用服务端组件
  • 什么都用新Hooks
  • 不考虑适用场景
  • 导致代码更复杂
  • 性能更差

新特性,要用对地方。

四、实战经验

1. 项目结构

好的项目结构,能避免很多坑。

我的项目结构:

src/
  components/    # 通用组件
  pages/         # 页面组件
  hooks/         # 自定义Hooks
  utils/         # 工具函数
  services/      # API服务
  store/         # 状态管理
  types/         # TypeScript类型
  • 按功能分
  • 组件和样式放一起
  • 自定义Hooks单独管理
  • 保持结构清晰

好的结构,是好代码的基础。

2. 自定义Hooks

自定义Hooks,是逻辑复用的利器。

常用的自定义Hooks:

  • useFetch:数据获取
  • useDebounce:防抖
  • useThrottle:节流
  • useLocalStorage:本地存储
  • useMediaQuery:响应式

把重复的逻辑抽成Hooks,代码更简洁。

3. 状态管理

状态管理,是React应用的核心。

我的经验:

  • 小项目:useState + useContext
  • 中等项目:useReducer + useContext
  • 大项目:Redux Toolkit或Zustand
  • 服务端状态:React Query或SWR

不要什么都用Redux,也不要什么都用Context。

4. 性能优化

性能优化的经验:

  • 先测量,再优化
  • 用React DevTools分析
  • 优化重渲染
  • 优化包体积
  • 优化首屏加载

不要过早优化,但也不要忽视性能。

5. 测试

测试,是质量的保障。

我的测试策略:

  • 单元测试:工具函数和Hooks
  • 组件测试:React Testing Library
  • 端到端测试:Cypress
  • 重点测试核心逻辑
  • 不追求100%覆盖率

测试,让重构更安心。

五、如何避免踩坑

1. 仔细看文档

第一个方法:仔细看文档。

  • 官方文档是最好的学习资源
  • 新特性先看文档
  • 理解原理再用
  • 不要想当然
  • 文档会告诉你坑在哪里

文档,是最好的老师。

2. 用ESLint

第二个方法:用ESLint。

  • 配置好ESLint
  • 用react-hooks插件
  • 它会帮你发现很多坑
  • 依赖问题
  • 规则违反

ESLint,是你的好帮手。

3. 写测试

第三个方法:写测试。

  • 测试能发现很多问题
  • 重构时有保障
  • 核心逻辑一定要测试
  • 测试用例要覆盖边界情况

测试,是质量的保障。

4. Code Review

第四个方法:Code Review。

  • 团队互相review
  • 发现自己看不到的问题
  • 分享经验
  • 共同进步
  • 好的code review文化

Code Review,能避免很多坑。

5. 持续学习

第五个方法:持续学习。

  • React更新很快
  • 要持续学习
  • 关注官方动态
  • 看优秀的开源项目
  • 参加社区讨论

持续学习,才能跟上React的发展。

六、对React 19的准备

1. 先学好React 18

第一个准备:先学好React 18。

  • 并发渲染
  • 自动批处理
  • useTransition
  • 服务端组件(实验性)
  • 打好基础

基础扎实,才能更好地学React 19。

2. 关注官方动态

第二个准备:关注官方动态。

  • 官方博客
  • React Conf
  • RFC讨论
  • GitHub仓库
  • 及时了解新特性

关注动态,才能提前准备。

3. 做实验项目

第三个准备:做实验项目。

  • 用新特性做小项目
  • 体验新特性
  • 发现问题
  • 积累经验
  • 为正式使用做准备

实验,是最好的学习方式。

4. 不要急着升级

第四个准备:不要急着升级。

  • React 19发布后
  • 等稳定版
  • 等生态兼容
  • 先在测试环境试
  • 确认没问题再上生产

升级,要谨慎。

七、写在最后

React 19前瞻实战,那些年我踩过的坑。

从类组件到Hooks,从React 18到期待React 19,我踩过很多坑:useEffect的依赖问题、无限循环、状态更新不及时、不必要的重渲染、Context滥用、服务端组件的误解。每个坑,都是一次学习,都是一次成长。

2023年了,React依然是最流行的前端框架。不管React怎么变,核心的开发经验是不变的:理解原理、写好代码、注意性能、持续学习。踩坑不可怕,可怕的是不从坑中学习。

最后,用一句话总结:"React的坑,大多是因为不理解原理。理解了原理,就能避开大部分坑。React 19值得期待,但也要做好准备,先学好基础,再拥抱新特性。"

希望我的经验,能帮你少踩一些坑。