news 2026/8/16 10:49:44

Vue 3 中,unmounted 生命周期钩子会在组件实例被销毁并从 DOM 中移除后调用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Vue 3 中,unmounted 生命周期钩子会在组件实例被销毁并从 DOM 中移除后调用

Vue3中unmounted钩子在组件销毁时触发,常见场景包括:

  1. v-if条件变化;
  2. 动态组件切换;
  3. 路由导航;
  4. v-for列表更新;
  5. 父组件卸载;
  6. 手动调用unmount();
  7. Teleport目标移除;
  8. 组合式API停止响应式效果。

KeepAlive缓存的组件会触发deactivated而非unmounted。


最佳实践是在unmounted中清理定时器、事件监听等资源,避免内存泄漏。


理解这些触发条件有助于更好地管理组件生命周期。


在 Vue 3 中,unmounted生命周期钩子会在组件实例被销毁并从 DOM 中移除后调用。


以下是会触发组件卸载(unmount)的常见情景:


1.条件渲染导致的组件移除

vue

<template> <ChildComponent v-if="showChild" /> </template> <script setup> import { ref } from 'vue' const showChild = ref(true) // 当 showChild 变为 false 时,ChildComponent 会被卸载 setTimeout(() => { showChild.value = false // 触发 ChildComponent 的 unmount }, 3000) </script>

2.动态组件切换

vue

<template> <component :is="currentComponent" /> </template> <script setup> import { ref, shallowRef } from 'vue' import ComponentA from './ComponentA.vue' import ComponentB from './ComponentB.vue' const currentComponent = shallowRef(ComponentA) // 切换组件时,前一个组件会被卸载 const switchComponent = () => { currentComponent.value = ComponentB // ComponentA 会被卸载 } </script>

3.路由导航

javascript

// 路由导航时,离开当前路由对应的组件会被卸载 router.push('/new-route') // 当前路由组件会被卸载(如果不需要被缓存)

4.v-for 列表项变化

vue

<template> <div v-for="item in list" :key="item.id"> <ListItem :item="item" /> </div> </template> <script setup> import { ref } from 'vue' const list = ref([ { id: 1, name: 'Item 1' }, { id: 2, name: 'Item 2' } ]) // 移除数组元素时,对应的组件会被卸载 const removeItem = (id) => { list.value = list.value.filter(item => item.id !== id) } </script>

5.父组件被卸载

vue

<template> <ParentComponent v-if="showParent"> <!-- 当 ParentComponent 被卸载时,所有子组件也会被卸载 --> <ChildComponent /> </ParentComponent> </template>

6.手动卸载组件

vue

<template> <div ref="container"></div> </template> <script setup> import { ref, onMounted, createApp } from 'vue' import DynamicComponent from './DynamicComponent.vue' const container = ref(null) let appInstance = null onMounted(() => { // 手动挂载组件 appInstance = createApp(DynamicComponent) appInstance.mount(container.value) // 手动卸载组件 setTimeout(() => { appInstance.unmount() // 触发 unmount container.value.innerHTML = '' }, 5000) }) </script>

7.使用<Teleport>但目标元素被移除

vue

<template> <Teleport :to="target"> <Modal /> </Teleport> </template> <script setup> import { ref } from 'vue' const target = ref('body') // 如果目标元素被从 DOM 中移除,通过 Teleport 传送的组件也会被卸载 </script>

8.在组合式 API 中手动停止响应式效果

vue

<script setup> import { onUnmounted } from 'vue' // 当组件被卸载时,onUnmounted 钩子会被调用 onUnmounted(() => { console.log('组件已卸载') // 清理工作,如清除定时器、取消事件监听等 }) </script>

特殊情况:组件不会被卸载

使用<KeepAlive>缓存组件

vue

<template> <KeepAlive> <ComponentA v-if="showA" /> <ComponentB v-else /> </KeepAlive> </template>
  • 组件切换时不会触发unmounted,而是触发deactivated

  • 从缓存中移除时才会触发unmounted


使用<Suspense>的异步组件

异步组件的加载和卸载有特殊处理,但最终卸载时仍会触发unmounted


最佳实践

unmountedonUnmounted中:

  1. 清理定时器

  2. 取消事件监听器

  3. 清理第三方库实例

  4. 取消网络请求

  5. 清理全局状态监听


vue

<script setup> import { onUnmounted } from 'vue' let intervalId onMounted(() => { intervalId = setInterval(() => { console.log('定时执行') }, 1000) }) onUnmounted(() => { clearInterval(intervalId) // 清理定时器 }) </script>

理解这些触发情景有助于更好地管理组件生命周期和资源清理。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/31 11:42:35

AI 开源知识库大战:WeKnora、RAGFlow、FastGPT、FlashRAG,谁更厉害

我看大家对目前的开源RAG知识库都挺感兴趣的&#xff0c;就像来对比一下目前比较流行的几个知识库&#xff0c;看看哪个更适合你&#xff0c;哪个更有钱途&#xff0c;哈哈。 其实真要搭过这几个知识库&#xff0c;就会发现&#xff1a;每个用到的地方&#xff0c;还真不一样&a…

作者头像 李华
网站建设 2026/8/10 4:17:28

【课程设计/毕业设计】基于python-CNN深度学习的水果识别

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/8/6 23:37:47

深度学习毕设选题推荐:基于python-CNN的水果识别基于python的水果识别

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/7/31 11:42:40

Thinkphp和Laravel框架的高校教室报修管理系统_14oaj0v7

目录高校教室报修管理系统摘要项目开发技术介绍PHP核心代码部分展示系统结论源码获取/同行可拿货,招校园代理高校教室报修管理系统摘要 该系统基于ThinkPHP和Laravel框架开发&#xff0c;旨在为高校提供高效的教室设备报修与管理解决方案。通过整合两种框架的优势&#xff0c;…

作者头像 李华
网站建设 2026/8/1 14:10:22

LangChain-08 Query SQL DB 通过GPT自动查询SQL

我们需要下载一个 LangChain 官方提供的本地小数据库。 安装依赖 SQL: https://raw.githubusercontent.com/lerocha/chinook-database/master/ChinookDatabase/DataSources/Chinook_Sqlite.sql Shell: pip install --upgrade --quiet langchain-core langchain-community lang…

作者头像 李华