React 学习路线 MOC
从零基础到可独立交付 React 应用的系统学习路线:七个阶段、依赖关系、逐篇目录与 0 到 1 完成标准。
#type / moc
#status / growing
#tech / dev / frame
#resource / react
[!info] related notes
- 所属总入口:React MOC
- 对象介绍:React
- 阶段地图:React 基础 MOC · React Hooks MOC · React 状态与数据 MOC · React 性能 MOC · React SSR 与 RSC MOC
- 对照:Vue 学习路线 · React vs Vue3 状态模型
- 面试桥接:React 高频面试
React 学习路线 MOC
这个概念为什么出现
没有依赖顺序时,React 学习会变成 Hook 背板:会写 useEffect 却不懂渲染提交,会上状态库却不懂状态边界,会谈 RSC 却不懂水合。本路线把「从零到可交付 React 应用」拆成七个阶段。
[!abstract] 路线结论 先建立
UI = f(state)与单向数据流,再学事件与列表;随后以 Hooks 组织状态与副作用边界,再进入组件设计与状态提升/共享;性能建立在正确渲染模型上,最后才是路由、SSR/RSC 与工程交付。
整条路线围绕五个问题:
- 为什么界面是状态的函数,而不是 DOM 指令序列
- 渲染、提交与副作用边界如何划分
- Hooks 规则背后的调用顺序假设是什么
- 状态放在哪里:局部、提升、Context 还是外部库
- CSR / SSR / Hydration / RSC 各自解决什么问题
如何使用这份路线
| 场景 | 做法 |
|---|---|
| 从零开始 | 按阶段顺序;每篇先跑最小示例再看边界 |
| 已有 Vue/其他框架经验 | 可加速 JSX,但不要跳过渲染模型与 effect 边界 |
| 只抓主干 | 看文末 8 个主干主题 |
| 面试导向 | 主线后接 高频面试 |
| 已会常用 Hook | 从 reducer/Context 状态边界开始,用 BodySense 流式问诊反向补渲染与副作用心智 |
难度标记
- L1 入门 · L2 基础 · L3 核心心智 · L4 工程/性能 · L5 架构进阶
依赖关系总图
flowchart TD
S1["阶段一 组件与 JSX"] --> S2["阶段二 核心 Hooks"]
S2 --> S3["阶段三 副作用边界"]
S3 --> S4["阶段四 组件与状态设计"]
S4 --> S5["阶段五 渲染与性能"]
S4 --> S6["阶段六 路由与数据"]
S5 --> S7["阶段七 SSR/RSC 与交付"]
S6 --> S7
阶段与子 MOC 对照
| 阶段 | 目标 | 主要子 MOC |
|---|---|---|
| 一 | JSX、组件、props/state/ref、事件、列表 | React 基础 MOC |
| 二 | useState/useRef/useContext/useReducer | React Hooks MOC |
| 三 | effect 与外部系统同步 | React Hooks MOC |
| 四 | 组件设计、状态边界、受控组件 | 状态与数据 MOC |
| 五 | 重渲染、memo、列表性能 | React 性能 MOC |
| 六 | 路由、数据加载、工程结构 | 状态与数据 MOC · React MOC |
| 七 | Hydration、SSR、RSC | SSR 与 RSC MOC |
阶段一:组件与 JSX 心智
目标:建立声明式 UI 与数据到视图的单向流。
完成标准:
- 能解释
UI = f(state) - 能正确使用 props 与本地 state
- 能写出带 key 的列表渲染
| 序号 | 笔记 | 核心问题 | 难度 | 源码 |
|---|---|---|---|---|
| 1.1 | React | React 解决什么问题 | L1 | 否 |
| 1.2 | JSX | JSX 如何表达 UI 树 | L1 | 否 |
| 1.3 | props、state 与 ref | 三类数据源边界 | L2 | 否 |
| 1.4 | 事件处理与状态更新 | 事件如何触发更新 | L2 | 否 |
| 1.5 | 列表渲染与 key | key 稳定身份的作用 | L2 | 建议 |
| 1.6 | 第一印象与主线 | 初学抓手 | L1 | 否 |
| 1.7 | 受控与非受控 | 表单数据所有权 | L3 | 否 |
阶段二:核心 Hooks
目标:用 Hooks 表达状态、引用、上下文与本地状态机。
完成标准:
- 理解 Hooks 只能在函数组件顶层调用的原因
- 能区分 state 与 ref
- 能用 reducer 管理多分支本地状态
| 序号 | 笔记 | 核心问题 | 难度 | 源码 |
|---|---|---|---|---|
| 2.1 | React Hooks | Hooks 为什么出现 | L2 | 否 |
| 2.2 | Hooks 总览 | 常用 Hooks 地图 | L2 | 否 |
| 2.3 | useState | 状态如何触发重渲染 | L2 | 建议 |
| 2.4 | useState 内部 | 更新队列直觉 | L4 | 需要 |
| 2.5 | useRef | 不触发渲染的盒子 | L2 | 否 |
| 2.6 | useContext | 跨层读上下文 | L2 | 否 |
| 2.7 | useReducer | 本地状态机 | L3 | 否 |
| 2.8 | React vs Vue3 状态模型 | 对照心智 | L3 | 否 |
| 2.9 | 生命周期与 Hooks | 生命周期映射 | L2 | 否 |
阶段三:副作用边界
目标:把“渲染”和“与外部系统同步”分开。
完成标准:
- 能写出正确依赖数组与清理函数
- 知道哪些逻辑不该进 effect
- 能区分 useEffect 与 useLayoutEffect
| 序号 | 笔记 | 核心问题 | 难度 | 源码 |
|---|---|---|---|---|
| 3.1 | 副作用与外部系统 | effect 的真正职责 | L3 | 建议 |
| 3.2 | useEffect | 提交后同步外部系统 | L3 | 建议 |
| 3.3 | useEffect 内部 | 实现层直觉 | L4 | 需要 |
| 3.4 | useLayoutEffect | 布局前同步 | L3 | 否 |
| 3.5 | 自定义 Hooks | 逻辑复用边界 | L3 | 否 |
阶段四:组件设计与状态管理
目标:把状态放在正确边界,组件职责清晰。
完成标准:
- 能在提升状态与局部状态间取舍
- 能说明 Context 不适合什么
- 能做基础状态管理选型
| 序号 | 笔记 | 核心问题 | 难度 | 源码 |
|---|---|---|---|---|
| 4.1 | 组件设计原则 | 组件如何切分 | L3 | 否 |
| 4.2 | 状态提升 vs 就近 | 状态放哪 | L3 | 否 |
| 4.3 | Context 与状态管理边界 | Context 适用面 | L3 | 否 |
| 4.4 | 状态管理选型 | 库何时值得引入 | L3 | 否 |
| 4.5 | 按功能组织目录 | 工程结构 | L2 | 否 |
| 4.6 | 常见模式 | 模式索引 | L2 | 否 |
| 4.7 | React 中的 TypeScript 组件与 Hook 类型 | props、事件、Reducer 与 Context 如何建模 | L3 | 建议 |
| 4.8 | React 类型化包装组件与多态组件 | 如何继承 props、处理 ref 与组件变体 | L3 | 建议 |
| 4.9 | 组件内服务端状态与客户端状态 | 远程数据和本地交互状态如何分工 | L3 | 否 |
阶段五:渲染与性能
目标:在正确性之后谈重渲染与缓存。
完成标准:
- 能解释重渲染传播路径
- 知道 memo/useMemo/useCallback 的成本
- 能优化列表而不过早优化
| 序号 | 笔记 | 核心问题 | 难度 | 源码 |
|---|---|---|---|---|
| 5.1 | 渲染与重渲染 | 何时重渲染 | L3 | 建议 |
| 5.2 | 渲染传导与状态边界 | 状态边界如何止损 | L4 | 建议 |
| 5.3 | prop 身份与重渲染 | 引用相等性 | L3 | 否 |
| 5.4 | useMemo | 计算结果缓存 | L3 | 否 |
| 5.5 | useCallback | 函数身份缓存 | L3 | 否 |
| 5.6 | memo | 组件浅比较 | L3 | 否 |
| 5.7 | 列表性能 | 大列表策略 | L4 | 否 |
| 5.8 | 表单性能 | 输入卡顿治理 | L3 | 否 |
| 5.9 | 性能总览 | 方法论 | L3 | 否 |
| 5.10 | 虚拟 DOM | 协调层直觉 | L3 | 建议 |
阶段六:路由与数据
目标:把页面导航与服务端数据接入应用。
| 序号 | 笔记 | 核心问题 | 难度 | 源码 |
|---|---|---|---|---|
| 6.1 | 路由基础 | SPA 路由原理 | L2 | 否 |
| 6.2 | React Router 7 | 框架模式路由 | L3 | 否 |
| 6.3 | 路由数据加载 | loader 等数据入口 | L3 | 否 |
| 6.4 | TanStack Query 与 Suspense 集成 | 缓存数据、加载边界与错误边界如何协作 | L4 | 建议 |
| 6.5 | Stack 架构 | 历史协调器 | L4 | 建议 |
| 6.6 | Stack vs Fiber | Fiber 为何出现 | L4 | 建议 |
| 6.7 | 前端测试 | 组件、Hook 和业务行为如何验证 | L3 | 否 |
阶段七:SSR、RSC 与交付
目标:理解服务端渲染与组件边界。
| 序号 | 笔记 | 核心问题 | 难度 | 源码 |
|---|---|---|---|---|
| 7.1 | Hydration 水合 | 客户端如何接管 | L3 | 建议 |
| 7.2 | 水合不匹配 | 常见失败 | L3 | 否 |
| 7.3 | useEffect 与 SSR | 浏览器 API 边界 | L3 | 否 |
| 7.4 | useLayoutEffect 与 SSR | 布局 effect 警告 | L3 | 否 |
| 7.5 | Server vs Client Components | 职责划分 | L4 | 建议 |
| 7.6 | React Server Components | RSC 模型 | L4 | 建议 |
| 7.7 | SSR 数据获取 | 首屏数据 | L4 | 否 |
| 7.8 | SSR 架构边界 | 分层 | L4 | 否 |
| 7.9 | SSR/水合/RSC 对照 | 概念辨析 | L4 | 否 |
| 7.10 | 服务端直出与客户端请求 | 边界选择 | L3 | 否 |
| 7.11 | Vite 学习路线 | 工程构建 | L2 | 否 |
如果只抓主干,优先这 8 个主题
- JSX · props/state/ref
- useState
- useEffect
- 列表与 key
- 副作用与外部系统
- 渲染与重渲染
- Context 与状态边界
- Hydration · Server/Client
一条实用学习原则
不要一开始把 React 学成“背 Hook 面板”。先分清渲染逻辑、事件逻辑和副作用逻辑,再去理解状态管理和性能优化。
0 到 1 的完成标准
- 能解释一次 setState 如何走到界面更新
- 能正确使用 effect 清理,避免泄漏与重复请求
- 能设计受控表单与状态提升
- 能说明 memo 家族何时无效
- 能区分 CSR、SSR、Hydration、RSC
认知跳跃提醒
- 未理解渲染就堆 memo → 先 5.1 / 5.2
- 未理解 effect 边界就请求数据乱飞 → 先 3.1 / 3.2
- 未理解状态所有权就上全局库 → 先 4.2 / 4.3
- 未理解水合就上 RSC 口号 → 先 7.1 / 7.5 / 7.9
相关入口
自测题
- 为什么性能阶段放在状态设计之后?
- 自定义 Hook 解决的是什么问题,不解决什么?
答案
- 性能优化建立在正确的状态边界上;边界错误时 memo 只是掩盖问题。
- 解决逻辑复用与意图命名;不自动消除重渲染,也不替代状态架构设计。
BodySense 项目实战入口(把路线落到真实代码)
[!info] 你正在 BodySense(体态健康 AI 助手)中用 React + TS 实做下面这些概念。仓库里已经为几个「教学走廊」文件加了详细注释。建议阅读顺序:先读代码注释 → 翻对应笔记 → 回到代码确认。
| 想练的知识点 | 去看的代码(仓库内相对路径) | 对应笔记 |
|---|---|---|
useReducer 本地状态机 + 可辨识联合 action | apps/web/src/features/consultation/context/ActiveTurnContext.tsx | React 中的 TypeScript 类型设计 · 可辨识联合与穷尽检查 |
流式 SSE 解析、增量解码、AbortController 取消 | apps/web/src/features/consultation/hooks/useSSEProcessor.ts | Web Streams 增量解码 · AbortController 取消 |
| 跨端流事件契约(TS 侧形状) | packages/contracts/src/stream-events.ts | 泛型/约束/keyof · 编译期 vs 运行时边界 |
- 流式链路教材(仓库内):
docs/learning/06-javascript-typescript-streaming.md - 由易到难的实战任务(仓库内):
docs/learning/05-practice-tasks.md与.practice-map/maps/bodysense-fundamentals.md - 总导航:BodySense MOC