React中父子组件生命周期的执行顺序

在 React 中,父子组件的生命周期执行顺序遵循一个清晰的规律:父组件先准备,子组件再挂载;子组件先卸载,父组件再清理

核心原则 :渲染阶段由父到子(render 递归),提交阶段(DOM 更新)再由子到父(componentDidMount/Update 递归)。


一、初始挂载阶段(Mounting)

顺序:父组件 getDerivedStateFromProps / render → 子组件生命周期 → 父组件 componentDidMount

详细步骤(以类组件为例):

  1. 父组件constructor
  2. 父组件getDerivedStateFromProps
  3. 父组件render
    → 此时解析出子组件实例,开始子组件的生命周期
  4. 子组件constructor
  5. 子组件getDerivedStateFromProps
  6. 子组件render
  7. 子组件componentDidMount
  8. 父组件componentDidMount

注意:componentDidMount 是子组件先执行,父组件后执行。


二、更新阶段(Updating)

触发条件:propsstate 改变。

2.1 由父组件 state 变化引起的更新

  1. 父组件getDerivedStateFromProps
  2. 父组件shouldComponentUpdate
  3. 父组件render
    → 重新生成子组件,触发子组件更新
  4. 子组件getDerivedStateFromProps
  5. 子组件shouldComponentUpdate
  6. 子组件render
  7. 子组件getSnapshotBeforeUpdate
  8. 子组件componentDidUpdate
  9. 父组件getSnapshotBeforeUpdate
  10. 父组件componentDidUpdate

2.2 由子组件自身 state 变化引起的更新

只会触发子组件自身的更新生命周期,父组件不受影响(除非子组件通过回调修改父组件 state)。


三、卸载阶段(Unmounting)

顺序:父组件先标记卸载 → 子组件 componentWillUnmount → 父组件 componentWillUnmount

  1. 父组件:决定卸载子组件(例如条件渲染移除子组件)
  2. 子组件componentWillUnmount
  3. 父组件componentWillUnmount

子组件先执行清理工作,父组件最后清理。


四、函数组件中的近似顺序(useEffect)

函数组件没有直接等价的生命周期,但 useEffect 的执行顺序模拟了部分行为:

阶段 类组件顺序 函数组件近似顺序
挂载 父 render → 子 render → 子 didMount → 父 didMount 父 render → 子 render → 子 useLayoutEffect → 父 useLayoutEffect → 子 useEffect → 父 useEffect
更新 父 render → 子 render → 子 didUpdate → 父 didUpdate 类似,但 cleanup 在上一次 effect 之前执行
卸载 子 willUnmount → 父 willUnmount 子 useEffect cleanup → 父 useEffect cleanup

注意:useEffect 是在浏览器完成布局与绘制之后 异步执行,所以 useEffect 中父子顺序仍然是子先于父(因为组件树是深度优先渲染的)。


五、关键总结

  • 挂载 :父 render 先完成,但父 componentDidMount 要等所有子组件挂载完才执行。
  • 更新 :父 render 先执行,然后子组件更新,最后父 componentDidUpdate
  • 卸载 :子组件先执行 componentWillUnmount,父组件最后执行。
  • 函数组件useEffect 的顺序是子先于父,但执行时间点在布局/绘制之后。

这个顺序保证了:

  • 子组件在父组件访问它们之前已经准备好(或已清理)
  • DOM 测量/滚动位置等操作可以在合适的时机进行
相关推荐
paopaokaka_luck2 分钟前
非遗文物数字化系统(AI非遗问答、ONNX图像识别、协同过滤推荐、ECharts数据分析、非遗知识浏览与互动、文创商城订单闭环、文化活动报名签到、社区交流)
前端·javascript·vue.js·人工智能·数据分析·echarts
乘风gg6 分钟前
AI Coding 提效 2 倍是真的吗?到底怎么衡量效果
前端·ai编程·claude
用户921080262867 分钟前
从对象到原型链:理解 this、构造函数和 new
前端
猫不易12 分钟前
Webpack 与 Vite:从 Loader / Plugin 到 Rolldown 统一引擎
前端·vite
YHL24 分钟前
🎯 Danci —— 用 AI 驱动开发一个全栈英语单词学习平台
前端·后端
平头哥~25 分钟前
Day 20 _ 3D 翻卡_perspective 写错人,卡片就穿帮
前端·3d·css3·学习资料
小聪70833 分钟前
elpis-core 前端 Webpack 工程化实践
前端
2601_9539880734 分钟前
Ricon组态实时监控 - 毫秒级数据可视化
前端·物联网·数学建模·信息可视化·架构·前端框架
V158897262011 小时前
从滴滴模式看机器人租赁:撮合型租赁平台开发源码的调度系统设计思路
linux·前端·机器人
szarron1 小时前
国产手持式频谱分析仪选型攻略:TFN RC系列 vs HTOOL SA8T频谱分析仪 专业参数对比(军工/路测/调试全覆盖)
开发语言·前端·状态模式