Pixiv - KiraraShss
732 字
4 分钟
组件的卸载
欢迎来到我的博客!
使用 Markdown 格式编写。
今天学到了什么
- 组件的卸载
组件的卸载
卸载(Unmounting / Destroying)一个组件,指的是将这个组件从页面的 DOM 结构中移除,并销毁其对应的组件实例。
结合你工作区中的 Vue 项目,具体情况如下:
1. 怎么卸载一个组件?
在现代前端框架中,我们极少“手动”调用方法去销毁一个组件,而是通过数据驱动的方式让框架替我们卸载。常见的方法有:
-
使用条件渲染(最常见): 在 Vue 中使用
v-if="false",或者在 React 中使用{show && <Component />}。当条件为假时,该组件就会被完全卸载。<!-- isShow 变为 false 时,MyComponent 会被卸载 --><MyComponent v-if="isShow" /> -
路由切换: 当从页面 A 跳转到页面 B 时,页面 A 对应的路由组件以及它包含的所有子组件默认都会被卸载。
-
切换动态组件: 使用
<component :is="currentComponent">时,失去活跃状态的组件会被卸载(除非用<keep-alive>包裹)。 -
改变组件的
key属性: 如果给一个组件绑定了key,当key的值发生变化时,Vue/React 会认为这是一个全新的节点,从而卸载旧组件并挂载新组件。 -
手动调用销毁(仅限 Vue 2,Vue 3 已废弃): 可以调用
this.$destroy()。但不推荐这样做,最好通过数据流(v-if)来控制。
2. 一个组件怎么样才算(完全)卸载?
当以下过程发生时,组件就算是进入了“卸载中”和“已卸载”状态:
- 触发卸载生命周期钩子:
- Vue 2: 触发
beforeDestroy和destroyed。 - Vue 3: 触发
beforeUnmount和unmounted。 - React: 触发
componentWillUnmount或useEffect的返回函数(清除函数)。
- Vue 2: 触发
- 从 DOM 树中移除: 该组件之前渲染的所有 HTML 节点(真实 DOM)从页面文档中彻底删除。
- 解绑框架内置的监听器和关联: 框架会自动解除该组件上的数据响应式依赖(比如 Vue 的 Watcher)、自动移除模板中绑定的事件监听器(如
@click)。 - 释放内存准备被垃圾回收(GC): 组件实例对象本身失去引用,等待 JavaScript 引擎的垃圾自动回收(前提是你没有在别的全局变量里引用它)。
⚠️ 极其重要的注意事项(容易引发内存泄漏):
虽然框架会自动卸载组件的内部依赖,但跨出组件范围的副作用不会自动清理。组件卸载时,你必须在销毁钩子(如 beforeUnmount)中手动清理以下内容,否则不算是一次“干净的卸载”:
- 手动用
window.addEventListener或document.addEventListener绑定的全局事件。 - 使用的
setInterval或setTimeout定时器。 - 手动初始化的第三方库实例(比如 ECharts 实例对象的
chart.dispose())。实例销毁后,才算完全释放资源。
赞助支持
如果这篇文章对你有帮助,欢迎赞助支持!
最后更新于 2026-04-18,距今已过 136 天
部分内容可能已过时