vue组件调用生命周期

《vue基础学习-组件》提到组件传递数据方式:

1. props/$emit

  • 父传子:子组件通过 props 显式声明 自定义 属性,接收父组件的传值。
  • 子传父:子组件通过 $emit() 显式声明 自定义 事件,父组件调用自定义事件接收子组件返回的参数。

2. $ref / $parent

  • 父传子:父组件的方法中通过 this.$refs 访问子组件的引用。
  • 子传父:子组件中通过 this.$parent.$refs 访问父组件的引用。

本节将主要介绍组件调用中涉及的生命周期钩子。

1. <componet :is=“组件名” >

在 Vue.js 中,你可以使用 <component> 元素结合 :is 属性来动态地切换组件。这种方式非常灵活,可以根据数据的变化来渲染不同的组件。

<template><div><button @click="currentComponent = 'ComponentA'">Show Component A</button><button @click="currentComponent = 'ComponentB'">Show Component B</button><component :is="currentComponent"></component></div>
</template><script>
import ComponentA from './ComponentA.vue';
import ComponentB from './ComponentB.vue';export default {components: {ComponentA,ComponentB},data() {return {currentComponent: 'ComponentA'};}
};
</script>
  • <component :is="currentComponent"></component>:这里使用了 <component> 元素,并通过 :is 绑定一个变量 currentComponentcurrentComponent 的值决定了要渲染哪个组件。
  • currentComponent:这是一个响应式的数据属性,初始值为 'ComponentA'。当点击按钮时,这个值会被更新,从而触发组件的切换。

假设你有两个组件 ComponentA.vueComponentB.vue

ComponentA.vue

<template><div><h1>Component A</h1><p>This is Component A</p></div>
</template><script>
export default {name: 'ComponentA'
};
</script>

ComponentB.vue

<template><div><h1>Component B</h1><p>This is Component B</p><p>Count: {{ count }}</p><p>Double Count: {{ doubleCount }}</p><button @click="increment">Increment</button></div>
</template><script>
export default {name: 'ComponentB',data() {return {count: 0};},computed: {doubleCount() {return this.count * 2;}},methods: {increment() {this.count++;}}
};
</script>

点击 “Show Component A”,加载组件 ComponentA
在这里插入图片描述

点击 “Show Component B”,加载组件 ComponentB
在这里插入图片描述

点击 “increment”,数值改变:
在这里插入图片描述

但如果点击 “Show Component A” 后,再点击 “Show Component B”,组件 ComponentB 状态没有保存:
在这里插入图片描述

如果你希望在切换组件时保留组件的状态,可以使用 <keep-alive> 包裹 <component>

2. <keep-alive>

在 Vue.js 中,<keep-alive> 是一个内置组件,用于缓存组件实例,以避免重复渲染和销毁。

<template><div><button @click="currentComponent = 'ComponentA'">Show Component A</button><button @click="currentComponent = 'ComponentB'">Show Component B</button><keep-alive><component :is="currentComponent"></component></keep-alive></div>
</template><script>
import ComponentA from './ComponentA.vue';
import ComponentB from './ComponentB.vue';export default {components: {ComponentA,ComponentB},data() {return {currentComponent: 'ComponentA'};}
};
</script>

这样,即使组件被切换,它们的状态也会被保留。

点击 “Show Component A” 后,再点击 “Show Component B”,组件 ComponentB 状态不变:
在这里插入图片描述

总结:

  • 使用 <component :is="组件名"></component> 可以动态地切换组件。
  • 结合 <keep-alive> 可以保留组件的状态。
  • 通过改变 :is 绑定的变量值来控制显示哪个组件。

3. activated()

在 Vue.js 中,activateddeactivated 是 Vue 组件的 生命周期钩子,主要用于 <keep-alive> 包裹的组件。

  • activated:当组件被 激活 时调用。这通常发生在组件从缓存中恢复并重新显示时。
  • deactivated:当组件被 停用 时调用。这通常发生在组件被隐藏并放入缓存时。

ComponentB.vue

<template><div><h1>Component B</h1><p>This is Component B</p><p>Count: {{ count }}</p><p>Double Count: {{ doubleCount }}</p><button @click="increment">Increment</button></div>
</template><script>
export default {name: 'ComponentB',data() {return {count: 0};},computed: {doubleCount() {return this.count * 2;}},methods: {increment() {this.count++;}},activated() {console.log('Component activated');},deactivated() {console.log('Component deactivated');}
};
</script>

点击 “Show Component B”,加载组件 ComponentB ,打印 Component activated
在这里插入图片描述

点击 “Show Component A”,加载组件 ComponentA,打印 Component deactivated
在这里插入图片描述

再次点击 “Show Component B”,加载组件 ComponentB ,打印 Component activated
在这里插入图片描述

注意:

  • 生命周期钩子 activateddeactivated 必须和 <keep-alive> 结合使用才生效。

4. 生命周期钩子

在 Vue.js 中,生命周期钩子(Lifecycle Hooks)是一些特定的函数,你可以在这些函数中执行自定义逻辑。Vue 组件从创建到销毁的过程中会经历一系列的阶段,每个阶段都有相应的钩子函数可以让你插入自定义代码。

Vue 2 和 Vue 3 的生命周期钩子有一些差异。Vue 3 引入了一些新的生命周期钩子,并对一些旧的钩子进行了重命名。

  • Vue 2 生命周期钩子
    1. 创建阶段
      • beforeCreate:在实例初始化之后,数据、事件配置之前被调用。
      • created:在实例创建完成后被调用。此时实例已完成数据、事件配置。但是挂载阶段还没开始,$el 属性目前不可见。
    2. 挂载阶段
      • beforeMount:在挂载开始之前被调用。相关的 render 函数首次被调用。
      • mounted:在实例挂载到 DOM 之后被调用。
    3. 更新阶段
      • beforeUpdate:在数据更新时调用,发生在虚拟 DOM 打补丁之前。这里适合在更新之前访问现有的 DOM。
      • updated:在数据更新后调用,此时 DOM 已经更新。可以在这里执行依赖于 DOM 的操作。
    4. 销毁阶段
      • beforeDestroy:在实例销毁之前调用。在这一步,实例仍然完全可用。
      • destroyed:在实例销毁后调用。此时所有的事件监听器都被移除,所有的子实例也都被销毁。
    5. 其他钩子
      • activated:在 keep-alive 组件激活时调用。
      • deactivated:在 keep-alive 组件停用时调用。
      • errorCaptured:捕获一个来自后代组件的错误时被调用。此钩子会收到三个参数:错误对象、发生错误的组件实例以及一个包含错误来源信息的字符串。此钩子可以返回 false 以阻止该错误继续向上传播。
  • Vue 3 生命周期钩子
    1. 创建阶段
      • setup():在 Vue 3 中,beforeCreatecreated 钩子被 setup 函数取代。
    2. 挂载阶段
      • beforeMount:在挂载开始之前被调用。
      • mounted:在实例挂载到 DOM 之后被调用。
    3. 更新阶段
      • beforeUpdate:在数据更新时调用,发生在虚拟 DOM 打补丁之前。
      • updated:在数据更新后调用,此时 DOM 已经更新。
    4. 销毁阶段
      • beforeUnmount:代替 beforeDestroy
      • unmounted:代替 destroyed
    5. 其他钩子
      • onActivated:代替 activated
      • onDeactivated :代替 deactivated
      • onErrorCaptured:代替 errorCaptured

5. 常用生命周期钩子及使用场景

5.1 created

created 钩子在实例创建完成后被调用。此时实例已完成数据、事件配置。但是挂载阶段还没开始,$el 属性目前不可见。

典型用例:

  • 初始化数据。
  • 发起网络请求获取初始数据。
  • 设置事件监听器。
export default {created() {console.log('Component is created');this.fetchData();},methods: {fetchData() {// 发起网络请求,获取初始数据。}}
};

5.2 mounted

mounted 钩子在实例挂载到 DOM 之后被调用。

典型用例:

  • 操作 DOM。
  • 初始化第三方库(如 jQuery 插件)。
  • 启动定时器或动画。
export default {mounted() {console.log('Component is mounted');this.initThirdPartyLibrary();},methods: {initThirdPartyLibrary() {// 初始化第三方库}}
};

5.3 beforeUpdate

典型用例:

  • 在数据更新前保存当前状态。
  • 清理无效的数据或状态。

5.4 updated

典型用例:

  • 操作更新后的 DOM。
  • 更新 UI 状态。

5.5 beforeDestroy、beforeUnmount

典型用例:

  • 清理定时器。
  • 取消网络请求。
  • 移除事件监听器。

5.6 destroyed、unmounted

典型用例:

  • 最终清理工作。
  • 记录日志。

完整示例 Lifecycle.vue:

<template><div><h1>{{ message }}</h1><button @click="updateMessage">Update Message</button><h1>{{ count }}</h1><button @click="increment">Increment</button></div>
</template><script>
export default {data() {return {message: 'Hello, Vue 3!',count: 0}},methods: {updateMessage() {this.message = 'Message Updated!';},increment() {this.count++;}},created() {console.log('Component is created');console.log(this.message);},mounted() {console.log('Component is mounted');console.log(this.message);},beforeUpdate() {// 在更新前保存当前状态console.log(this.message);console.log('Before update, current count:', this.count);console.log('onBeforeUpdate called');},updated() {// 更新后的操作console.log(this.message);console.log('After update, new count:', this.count);console.log('onUpdated called');},beforeDestroy() {// 清理资源console.log('onBeforeUnmount called');},destroyed() {// 最终清理console.log('onUnmounted called');}
};
</script><style scoped>
/* 添加一些样式 */
h1 {color: blue;
}
</style>

总结:

  • created:初始化数据和设置事件监听器。
  • mounted:操作 DOM 和初始化第三方库。
  • beforeUpdate:在数据更新前保存状态。
  • updated:操作更新后的 DOM。
  • beforeUnmount/beforeDestroy:清理资源。
  • unmounted/destroyed:最终清理工作。

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

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

相关文章

【如何获取股票数据10】Python、Java等多种主流语言实例演示获取股票行情api接口之沪深A股历史分时KDJ数据获取实例演示及接口API说明文档

最近一两年内&#xff0c;股票量化分析逐渐成为热门话题。而从事这一领域工作的第一步&#xff0c;就是获取全面且准确的股票数据。因为无论是实时交易数据、历史交易记录、财务数据还是基本面信息&#xff0c;这些数据都是我们进行量化分析时不可或缺的宝贵资源。我们的主要任…

C++ ----Qt

1.什么是QT Qt是一个跨平台的C应用程序开发框架。 用于开发图形用户界面、嵌入式系统、以及其他应用程序&#xff08;嵌入式&#xff0c;桌面&#xff0c;汽车中控&#xff09;&#xff0c;支持Windows、macOS、Linux、Android和iOS等多个操作系统。 Qt框架提供了丰富的功能…

【ChatGPT】如何让 ChatGPT 理解多步骤指令

如何让 ChatGPT 理解多步骤指令 在与 ChatGPT 交互时&#xff0c;多步骤指令能够帮助模型更准确地理解复杂任务并逐步执行每个步骤。然而&#xff0c;如果多步骤指令没有清晰组织&#xff0c;可能会导致输出混乱或不完整。本文将介绍如何有效编写多步骤指令&#xff0c;使 Cha…

Docker-compose提示specified IP address..configured subnets问题以及Docker容器相关操作记录保存

一、Docker-compose提示user specified IP address is supported only when connecting to networks with user configured subnets 在网上下载的一些docker-compose.yml在执行的时碰到过多次如下报错&#xff1a; ERROR: for 5307e2acb....user specified IP address is supp…

【Flutter】Dart:环境搭建

Flutter 是一个基于 Dart 的跨平台开发框架&#xff0c;可以帮助我们快速构建移动应用程序。在开始 Flutter 开发之前&#xff0c;我们需要先搭建 Dart 的开发环境&#xff0c;并配置合适的编辑器&#xff0c;比如 VSCode。本教程将引导你一步步完成 Dart 和 Flutter 的环境搭建…

2024.10.17 软考学习笔记

刷题网站&#xff1a; 软考中级软件设计师在线试题、软考解析及答案-51CTO题库-软考在线做题备考工具

vue2项目 实现上边两个下拉框,下边一个输入框 输入框内显示的值为[“第一个下拉框选中值“ -- “第二个下拉框选中的值“]

效果: 思路: 采用vue中 [computed:] 派生属性的方式实现联动效果,上边两个切换时,下边的跟随变动 demo代码: <template><div><!-- 第一个下拉框 --><select v-model"firstValue"><option v-for"option in options" :key&q…

Github优质项目推荐 - 第六期

文章目录 Github优质项目推荐 - 第六期一、【WiFiAnalyzer】&#xff0c;3.4k stars - WiFi 网络分析工具二、【penpot】&#xff0c;33k stars - UI 设计与原型制作平台三、【Inpaint-Anything】&#xff0c;6.4k stars - 修复图像、视频和3D 场景中的任何内容四、【Malware-P…

适用于 Windows 的 4 个最佳免费数据恢复软件

计算机最重要的是用户数据。除了您的数据之外&#xff0c;关于计算机的其他一切都是可替换的。这三个是数据丢失的最常见原因&#xff1a; 文件/文件夹删除 丢失分区 损坏的分区 文件/文件夹删除是最常见的数据丢失类型。大多数时候&#xff0c;由于不小心删除文件/文件夹而…

G-Set(增长集合,Grow-Only Set)

一、概念 G-Set&#xff08;增长集合&#xff0c;Grow-Only Set&#xff09;是一种冲突自由复制数据类型&#xff08;Conflict-Free Replicated Data Type, CRDT&#xff09;&#xff0c;用于在分布式系统中同步和合并数据&#xff0c;而不需要中央协调器。G-Set 支持两种操作…

限流是什么?如何限流?怎么限流?

概述 什么是限流 对某一时间窗口内的请求数进行限制,保持系统的可用性和稳定性,防止因流量暴增而导致的系统运行缓慢或宕机 为什么要限流 因为互联网系统通常都要面对大并发大流量的请求,在突发情况下(最常见的场景就是秒杀、抢购),瞬时大流量会直接将系统打垮,无法…

html和css实现页面

任务4 html文件 任务5 htm文件 css文件 任务6 html文件 css文件 任务7 html文件 css文件

Java【多线程】synchronized关键字

目录 synchronized的特性 1.互斥 2.可重入 如何自己实现一个可重入锁&#xff1f; 关于死锁 死锁的第三种情况 N个线程M把锁 构成死锁的四个必要条件 java标准库中的线程安全类 线程不安全 线程安全 synchronized关键字-监视器锁monitor locker synchronized的特性 …

Tailscale自建中转服务器derper搭建笔记(基于docker)

自己搭建derper服务器&#xff0c;让Tailscale中转更流畅。 Tailscale是很好的远程组网工具&#xff0c;在两台机器P2P打洞成功的情况下可以实现网络直连&#xff0c;但如果打洞失败就会进行数据中转&#xff0c;我们的数据要跑到国外再跑回来&#xff0c;这样速度就很慢了。 …

STGCN解读(论文+代码)

一、引言 引言部分不是论文的重点&#xff0c;主要讲述了交通预测的重要性以及一些传统方法的不足之处。进而推出了自己的模型——STGCN。 二、交通预测与图卷积 第二部分讲述了交通预测中路图和图卷积的概念。 首先理解道路图&#xff0c;交通预测被定义为典型的时间序列预测…

Axure重要元件一——动态面板

亲爱的小伙伴&#xff0c;在您浏览之前&#xff0c;烦请关注一下&#xff0c;在此深表感谢&#xff01; 本节课&#xff1a;动态面板 课程内容&#xff1a;认识动态面板、动态面板基本操作 应用场景&#xff1a;特定窗口、重要交互、长页面、容器等 一、认识动态面板 动态…

DeBiFormer:带有可变形代理双层路由注意力的视觉Transformer

https://arxiv.org/pdf/2410.08582v1 摘要 带有各种注意力模块的视觉Transformer在视觉任务上已表现出卓越的性能。虽然使用稀疏自适应注意力&#xff08;如在DAT中&#xff09;在图像分类任务中取得了显著成果&#xff0c;但在对语义分割任务进行微调时&#xff0c;由可变形…

bug的定义和测试

一、软件测试的生命周期 软件测试的⽣命周期是指测试流程&#xff0c;这个流程是按照⼀定顺序执⾏的⼀系列特定的步骤&#xff0c;去保证产品 质量符合需求。在软件测试⽣命周期流程中&#xff0c;每个活动都按照计划的系统的执⾏。每个阶段有不同的 ⽬标和交付产物 需求分析…

【python+Redis】hash修改

文章目录 前请详解一、关于Update1. 语法2. 代码示例 二、完整代码 前请详解 Redis库数据 keyvalue1{“id”: 1, “name”: “xxx”, “age”: “18”, “sex”: “\u7537”}2{“id”: 2, “name”: “xxx”, “age”: “18”, “sex”: “\u5973”}3{“id”: 3, “name”: “…

软件测试面试题600多条及答案

这些问题都是软件测试领域常见的面试问题&#xff0c;以下是一些可能的答案&#xff1a; 什么是软件测试&#xff1f; 软件测试是一系列活动&#xff0c;旨在评估软件产品的质量和性能&#xff0c;以确保它符合规定的需求和标准。它包括执行程序或系统以验证其满足规定需求的过…