You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React组件unmount(卸载)的触发时机与卸载后表现是什么?

React组件unmount(卸载)核心说明

unmount是React组件生命周期的最终阶段,指组件实例被从React维护的渲染树中完全移除的过程,不存在「组件渲染完成自动卸载」的逻辑。


1. unmount的触发时机

unmount只会在特定场景下触发,和组件单次渲染完成没有关系,常见触发场景包括:

  • 条件渲染结果变为false:比如父组件中写了{isShow && <Home />},当isShow从true变为false时,Home组件会触发卸载
  • 路由切换:单页应用路由跳转后,当前路由匹配的组件被新路由组件替换,原组件卸载
  • 组件key值变更:父组件渲染时给当前组件传入的key属性发生变化,React会判定为旧组件需要卸载,重新挂载新key对应的同类型组件
  • 根节点卸载:整个React应用通过根实例调用root.unmount()被整体卸载时,所有挂载的组件都会触发卸载

针对你日志里出现的「刚挂载就打unmounted日志」的特殊现象:
这是React 18及以上版本,开发环境开启<StrictMode>(严格模式)的默认校验行为,不是真实的业务卸载。严格模式会对首次挂载的组件执行一次「挂载→模拟卸载→重新挂载」的双执行流程,用来提前排查effect漏写清理逻辑、状态不一致的问题,这个模拟流程仅在开发环境存在,生产环境不会触发。


2. unmount阶段的执行逻辑,以及页面内容未消失的原因

真实unmount流程会执行的操作

  • 按声明顺序执行所有useEffect、useLayoutEffect返回的清理函数(也就是你代码里打印unmounted的回调)
  • 清除组件内部维护的所有state、ref的引用关联
  • 从虚拟DOM树中移除该组件节点
  • 移除页面对应的真实DOM节点,组件渲染的内容会从页面上完全消失

你看到打印unmounted后页面仍显示内容的原因

你触发的是严格模式的模拟卸载,不是真实卸载。
这个模拟流程只会执行effect的清理函数做逻辑校验,不会真的操作DOM移除页面内容,执行完清理逻辑后会立刻重新执行组件渲染、重新跑effect的注册逻辑,对应你日志里unmounted之后马上又打印了一次inside useEffect,全程页面上的Hello World节点没有被删除,所以你能一直看到内容。

如果是真实业务场景触发的卸载,等清理函数执行完成后,组件对应的DOM会被直接移除,页面上不会再保留相关内容。


内容的提问来源于stack exchange,提问作者Aniket Kumar Paul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 13:24:22