前端开发
升级 React 应用并迁移类组件到 Hooks 时如何操作
在现代化 React 代码库、迁移到 Hooks 或升级到最新 React 版本时使用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 49/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
升级 React 应用并迁移类组件到 H通用
解决思路
- 按版本梳理破坏性变更:React 17 关注事件委托变化、移除事件池、effect 清理时机、JSX transform(无需再 import React);React 18 关注自动批处理、并发渲染、Strict Mode 变化(双重调用)、新 root API、服务端 Suspense。
- 将类组件的 state 迁移为 useState:把 constructor 中的 this.state 拆分为多个 useState,把 this.setState 改为对应的 set 函数。
- 将生命周期方法迁移为 useEffect:componentDidMount 对应 useEffect(..., []),componentDidUpdate 对应带依赖数组的 useEffect,componentWillUnmount 对应 useEffect 的 cleanup 返回函数。
- 在 useEffect 中处理异步请求时使用 cancelled 标志:请求完成后若 cancelled 为 true 则不更新 state,并在 cleanup 中设置 cancelled = true,依赖数组填入触发重新请求的 props(如 [id])。
- 将 Context consumer 与 HOC 迁移为 Hooks:用 useContext(ThemeContext) 替代 static contextType,用自定义 hook(如 useUser)替代数据获取 HOC。
- 升级到 React 18 新 root API:把 ReactDOM.render(<App />, document.getElementById('root')) 改为 createRoot(document.getElementById('root')).render(<App />)。
- 利用 React 18 自动批处理:同步与异步(如 setTimeout)中的多次 setState 都会合并为一次重渲染;如需强制同步刷新,使用 react-dom 的 flushSync 包裹更新。
- 使用 useTransition 区分紧急与非紧急更新:输入框的 setQuery 立即执行,搜索结果用 startTransition 包裹,并用 isPending 显示 Spinner。
- 使用 Suspense 做数据获取:用 <Suspense fallback={<Loading />}> 包裹会挂起的组件,组件内通过 resource.read() 读取数据,支持嵌套 Suspense。
- 查阅 references/details.md 获取更详细的模板与完整模式库。