子组件先卸载、父组件后卸载,因为React按DOM树逆序(自底向上)执行componentWillUnmount,确保子组件依赖资源先清理,再释放父组件,保障卸载安全性。

子组件先卸载,父组件后卸载——这是 React 类组件中 componentWillUnmount 的标准执行顺序。
为什么子组件比父组件先触发 componentWillUnmount?
React 采用自顶向下挂载、自底向上卸载的 DOM 树遍历逻辑。当父组件决定卸载时,它内部的子组件必须先从 DOM 和内存中清理干净,才能安全释放父组件自身。这和“建楼先打地基、拆楼先拆屋顶”类似,确保依赖关系不被破坏。
卸载阶段的具体触发顺序
假设父组件 A 渲染子组件 B,且两者都定义了 componentWillUnmount:
- B.componentWillUnmount(子组件先执行)
- A.componentWillUnmount(父组件后执行)
这个顺序在以下场景下均成立:
- 父组件被条件渲染移除(如
{show && <a></a>}中show变为false) - 路由跳转导致组件树整体替换
- ReactDOM.unmountComponentAtNode() 手动卸载根节点
实际开发中需要注意什么?
这个顺序直接影响副作用清理的安全性:
- 子组件应在自己的 componentWillUnmount 中清理自身副作用(如定时器、事件监听、订阅)
- 父组件不应假设子组件状态还可用 —— 子组件实例在 componentWillUnmount 后即被销毁,不可再访问其 state 或 props
- 若需协调父子清理逻辑(例如共享一个 WebSocket 连接),应由父组件统一管理连接,子组件只负责通知或透传事件,而非各自独立关闭
函数组件用 useEffect 怎么对应?
函数组件中,useEffect 的清除函数执行顺序与类组件一致:
- 子组件 useEffect 的清除函数先运行
- 父组件 useEffect 的清除函数后运行
这是因为 React 内部按组件挂载的逆序(即卸载顺序)调用所有清理函数,与组件树结构严格对齐。


















