说明:标题提到的React 19在本文写作时(2023年2月)尚未发布(React 19于2024年发布)。
本文基于React的使用经验,以及React 19的预期特性(根据官方路线图和RFC),聊聊React开发中的踩坑总结和实战经验。
一、React的发展回顾
1. 从类组件到函数组件
React的发展,经历了几个阶段。
- 早期:类组件为主
- React 16.8:引入Hooks
- React 17:无新特性,主要是改进
- React 18:并发渲染、自动批处理
- React 19:预期会有更多改进
Hooks的引入,是React发展的重要里程碑。
2. React 18的新特性
React 18已经发布的新特性:
- 并发渲染(Concurrent Rendering)
- 自动批处理(Automatic Batching)
- useTransition
- useDeferredValue
- Suspense改进
- 服务端组件(Server Components)
这些特性,改变了React的开发方式。
3. React 19的预期
根据官方路线图和RFC,React 19可能包括:
- 服务端组件稳定版
- 新的Hooks
- 文档改进
- 性能优化
- 更好的TypeScript支持
React 19值得期待,但React 18已经很强大了。
二、React开发中的常见坑
1. 坑一:useEffect的依赖问题
最常见的坑:useEffect的依赖问题。
// 错误:缺少依赖
useEffect(() => {
fetchData(userId);
}, []); // 缺少userId
// 正确
useEffect(() => {
fetchData(userId);
}, [userId]);- 依赖数组漏了
- 导致闭包陷阱
- 数据不更新
- 或者无限循环
解决方法:
- 仔细检查依赖数组
- 使用ESLint的react-hooks插件
- 理解闭包
- 必要时用useRef
2. 坑二:无限循环
useEffect的另一个坑:无限循环。
// 错误:每次渲染都创建新对象,导致无限循环
useEffect(() => {
setData({...data, updated: true});
}, [data]);- useEffect里setState
- 依赖是对象或数组
- 每次渲染都是新引用
- 导致无限循环
解决方法:
- 用useMemo缓存对象
- 用函数式更新
- 拆分effect
- 仔细设计依赖
3. 坑三:状态更新不及时
有时候,状态更新不及时。
// 错误:以为setCount后count立即更新
const handleClick = () => {
setCount(count + 1);
console.log(count); // 还是旧值
};- setState是异步的
- 不会立即更新
- 读取的是旧值
- 容易出bug
解决方法:
- 用函数式更新
- 用useEffect监听变化
- 用useRef保存最新值
- 理解React的渲染机制
4. 坑四:不必要的重渲染
React应用常见的性能问题:不必要的重渲染。
- 父组件渲染,子组件都跟着渲染
- 没有用React.memo
- 没有用useMemo和useCallback
- 大列表没有虚拟化
解决方法:
- 用React.memo优化子组件
- 用useMemo缓存计算结果
- 用useCallback缓存函数
- 大列表用react-window或react-virtualized
5. 坑五:Context的滥用
Context的滥用,也是常见问题。
- 什么都往Context里放
- 导致整个应用重渲染
- 性能很差
- 状态管理混乱
解决方法:
- Context只放真正全局的状态
- 拆分Context
- 用useMemo优化Provider的value
- 考虑用Redux或其他状态管理库
6. 坑六:服务端组件的误解
React 18引入了服务端组件,很多人有误解。
- 以为服务端组件是SSR
- 以为服务端组件不能交互
- 混淆了客户端组件和服务端组件
- 用错了"use client"
解决方法:
- 仔细阅读官方文档
- 理解服务端组件的原理
- 合理划分客户端和服务端
- 从小项目开始实践
三、实战经验
1. 项目结构
好的项目结构,能提高开发效率。
我的项目结构:
src/
components/ # 通用组件
pages/ # 页面组件
hooks/ # 自定义Hooks
utils/ # 工具函数
services/ # API服务
store/ # 状态管理
types/ # TypeScript类型
styles/ # 样式- 按功能分,不是按类型分
- 组件和样式放一起
- 自定义Hooks单独管理
- 保持结构清晰
2. 自定义Hooks
自定义Hooks,是React开发的利器。
常用的自定义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. 测试
测试,是React开发的重要部分。
我的测试策略:
- 单元测试:工具函数和Hooks
- 组件测试:React Testing Library
- 端到端测试:Cypress
- 不要追求100%覆盖率
- 重点测试核心逻辑
测试能保证代码质量,也能让重构更安心。
四、React 19的预期特性
1. 服务端组件稳定
React 19可能让服务端组件稳定。
- 服务端组件减少客户端JS
- 提高首屏性能
- 简化数据获取
- 改变前端开发方式
服务端组件,是React的未来。
2. 新的Hooks
React 19可能引入新的Hooks。
- useFormStatus:表单状态
- useOptimistic:乐观更新
- useActionState:动作状态
- 这些Hooks让表单处理更简单
新的Hooks,能简化很多常见场景。
3. 文档改进
React 19可能配合新文档。
- 更清晰的教程
- 更好的示例
- 更完整的API文档
- 中文文档更完善
文档改进,对新手很友好。
4. 性能优化
React 19会继续优化性能。
- 更好的并发渲染
- 更智能的批处理
- 更小的包体积
- 更快的渲染
性能优化,是React持续的主题。
五、升级建议
1. 先升级到React 18
如果还在用React 17或更早,先升级到18。
- React 18是稳定版
- 兼容性好
- 新特性多
- 为React 19做准备
2. 了解并发渲染
升级到React 18后,了解并发渲染。
- 并发渲染改变了渲染机制
- 有些库可能不兼容
- 需要测试
- 逐步采用新特性
3. 关注官方动态
关注React官方动态。
- 官方博客
- React Conf
- RFC讨论
- GitHub仓库
及时了解React的发展方向。
4. 不要急着升级
React 19发布后,不要急着升级。
- 等稳定版
- 等生态兼容
- 先在测试环境试
- 确认没问题再上生产
升级要谨慎,不要盲目追新。
六、常见问题
1. React 19什么时候发布?
根据官方路线图,React 19可能在2024年发布。
- 现在(2023年初)还在开发中
- 可以关注官方动态
- 不要急着用实验版
- 等稳定版发布
2. 要不要学React?
要。
- React依然是最流行的前端框架
- 生态完善
- 就业机会多
- 学习资源丰富
3. React和Vue怎么选?
根据项目和团队选择。
- React:生态大,灵活,就业机会多
- Vue:简单,文档好,国内流行
- 都学也可以
- 核心是前端基础
4. Hooks还是类组件?
用Hooks。
- Hooks是React的未来
- 类组件不再推荐
- 新项目用Hooks
- 老项目可以逐步迁移
七、写在最后
React 19前瞻,虽然还没发布,但React的发展方向已经很清晰了。
并发渲染、服务端组件、新的Hooks、性能优化,这些都是React的未来。但不管React怎么变,核心的开发经验是不变的:理解原理、写好代码、注意性能、持续学习。
2023年了,React依然是最流行的前端框架。不管你是新手还是老手,都值得深入学习。踩坑不可怕,可怕的是不从坑中学习。
最后,用一句话总结:"React的坑,大多是因为不理解原理。理解了原理,就能避开大部分坑。React 19值得期待,但React 18已经很强大了。"
希望这篇文章能帮到你。
评论(0)
暂无评论,快来抢沙发~
评论功能仅对会员开放,请先登录
登录