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>

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1125577.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

校平机:金属板材的“应力整形术“

基本原理&#xff1a;消除内应力的力学博弈 校平机是通过塑性弯曲变形来消除金属板材内部残余应力的设备。金属在轧制、切割或热处理后&#xff0c;内部应力分布不均会导致宏观不平整。校平机利用多组交错排列的辊系&#xff0c;使板材经历多次小曲率的正反弯曲&#xff0c;迫…

学习收藏】零门槛上手Ollama:本地大模型部署与实战体验分享

文章详细介绍了本地大模型工具Ollama的安装与使用方法&#xff0c;涵盖Windows和Linux(wsl2)两种环境。作者通过实际测试体验了不同模型的功能&#xff0c;指出本地模型虽功能不及云端大模型&#xff0c;但能满足基本需求且保护隐私。Ollama还提供cloud版本&#xff0c;解决了本…

Linux环境下Tomcat的安装与配置详细指南

Apache Tomcat是一个广泛使用的开源Java Servlet容器和Web服务器&#xff0c;适用于运行Java Web应用程序。本指南将详细介绍如何在Linux环境中安装和配置Tomcat&#xff0c;包括必要的前提条件、下载安装、配置环境变量、设置为系统服务以及基本的安全配置。 目录 前提条件安…

程序员必学!大模型产品经理入门指南(附7阶段学习路线+年薪80万转型案例)

大模型产品经理在2025年迎来黄金发展期&#xff0c;薪资涨幅超50%&#xff0c;一线城市资深年薪突破80万。相比程序员&#xff0c;产品经理凭借场景挖掘、资源整合和产品设计能力可直接切入。文章详解了5大核心能力模型和7阶段学习路线&#xff0c;从认知筑基到实战应用&#x…

Linux系统安装部署Tomcat

1、进入Tomcat官网&#xff0c;官网地址&#xff1a;https://tomcat.apache.org/ 2、点击左侧Download下的Archives按钮 3、选择需要下载的版本 下载地址&#xff1a;https://archive.apache.org/dist/tomcat/ 4、点击自己需要下载的版本&#xff0c;我这里下载的是9.0.6 5、…

AirCloud平台与excloud扩展库协同实战:核心功能落地案例!

在边缘智能与云边协同日益融合的今天&#xff0c;AirCloud平台以其出色的设备管理与资源调度能力脱颖而出&#xff0c;而excloud扩展库则为平台注入了灵活的功能扩展机制。二者的协同应用&#xff0c;为复杂业务场景提供了强有力的支撑。但如何通过合理配置实现功能最大化&…

uvm_config_db机制学习

1. 当uvm_config_db传递一个类的句柄时&#xff0c;传递的是这个句柄&#xff0c;如果有组件在后续的phase中&#xff0c;改变了对象的值&#xff0c;那么其他组件也能感知到这个对象的值发生了变化并不是在build_phase阶段&#xff0c;这个句柄被set了之后&#xff0c;值就不会…

Linux系统下安装配置 Nginx 超详细图文教程_linux安装nginx

#安装当前路径下所有安装包 rpm -Uvh *.rpm --nodeps --force2.2、安装Nginx 找到Nginx的安装包进行解压 #解压安装包 tar -zxvf nginx-1.24.0.tar.gz进入解压之后的nginx目录下&#xff1a; #进入nginx目录 cd /usr/local/nginx-1.24.0执行配置脚本&#xff0c;–prefix是指定…

基于STM32的果蔬保鲜系统设计

基于STM32的果蔬保鲜系统设计摘要随着果蔬产业的迅速发展&#xff0c;食品保鲜要求日益增高&#xff0c;研究表明控制保鲜库温湿度恒定和二氧化碳的浓度稳定对延长果蔬存储时间有显著促进作用。在果蔬保鲜过程中&#xff0c;对温湿度、二氧化碳浓度等参数的实时准确采集和检测是…

调研了一下大模型知识蒸馏方向近几年的一些工作

概述 知识蒸馏的目的是将知识从大型复杂模型转移到更小更高效的模型中。 按照实现类型&#xff0c;大体可分为两种&#xff1a; 黑盒蒸馏&#xff08;Black-box&#xff09;&#xff1a;学生模型仅可访问教师模型的输入和输出白盒蒸馏&#xff08;White-box&#xff09;&#x…

深度学习计算机毕设之机器学习基于python-CNN的水果识别

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

一、CS反恐精英AMXX插件安装(附带安装包)

本期内容讲CS反恐精英安装AMXX(AMX Mod X)插件,是一个扩展工具,核心是自定义游戏规则、添加玩法以及管理服务器秩序的工具。最为常见的死亡竞赛、生化模式等这些都是需要依赖AMXX才得以实现,默认版本下是不带有该插件的,需要自己来去安装,当然也有一些版本已经安装好了,…

uvm_factory机制学习

不仅uvm_component可以用type_id_create&#xff0c;uvm_object类也可以用type_id_create

maven导入spring框架

在eclipse导入maven项目&#xff0c; 在pom.xml文件中加入以下内容junit junit 3.8.1 test org.springframework spring-core ${org.springframework.version} org.springframework spring-beans ${org.springframework.version} org.springframework sprin…

maxun爬虫机器人介绍与部署

软件介绍 机器人爬虫工具&#xff0c;绕开编码&#xff0c;直接从网页中截图并且进行解析 一款全新的无代码网页数据提取平台&#xff0c;无需编程即可轻松抓取网站的数据&#xff0c;支持列表/文本抓取、截图、自定义代理、自动处理分页和滚动等功能。作为一个新的开源项目&…

Java进阶-SpringCloud设计模式-工厂模式的设计与详解

在Java和Spring Cloud的上下文中&#xff0c;虽然Spring Cloud本身并没有直接实现传统的设计模式&#xff08;如工厂模式&#xff09;&#xff0c;但理解设计模式如何与Spring框架结合使用是非常重要的。工厂模式是一种创建型设计模式&#xff0c;它提供了一种封装对象创建过程…

深度学习毕设项目:基于python-CNN的水果识别

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

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

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

快速查看电脑开机时间

查看当前电脑当次开机时间&#xff1a; 1.winr 打开运行输入框 2.输入cmd 回车 3.输入 下面命令后回车systeminfo | findstr /i 系统启动时间

Python+flask的高校餐饮档口管理系统的设计与实现_6t8pw5bl-Pycharm vue django项目源码

目录高校餐饮档口管理系统概述技术架构与模块设计核心功能实现创新点与扩展性关于博主开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;高校餐饮档口管理系统概述 该系统基于PythonFlask框架…