vue 中监听生命周期事件

vue 中监听生命周期事件

    • 常见的添加自定义事件的写法
    • 希望在子组件挂载时通知父组件
    • 在模板上监听组件生命周期
    • vue3 有类似的写法吗?
      • jsx 中如何监听 vue3 组件的生命周期事件呢?
    • vue3 父组件组件的生命周期的执行顺序是什么?
    • 小结

vue2 提供了一些生命周期事件的方式,可以在组件销毁时执行一些操作。

命名为 hook:lifeHook ,比如 hook:beforeDestroy

常见的添加自定义事件的写法

{mounted() {this.onResize = () => {console.log('onResize')}window.addEventListener('resize', this.onResize)},beforeDestroy() {window.removeEventListener('resize', this.onResize)}
}

这种写法存在两个小问题:

  1. 添加了额外的变量onResize,感觉有点多余;
  2. 监听 resize 的逻辑分散在不同的生命周期中,不好维护。

使用监听生命周期事件的方式优化:

{mounted() {const onResize = () => {console.log('onResize')}window.addEventListener('resize', onResize)// hook:lifeHook $once 只执行一次this.$once('hook:beforeDestroy', () => {window.removeEventListener('resize', onResize)})}
}

凡在销毁时执行的操作,都可这样优化。

有人说方式1的问题不大,也没有优化多少,似乎没有多少用。

再看一个场景:

希望在子组件挂载时通知父组件

通常的写法:

// SonComponent.vue
{mounted() {this.$emit('mounted')}
}

在父组件中监听子组件触发的事件:

<template><div><SonComponent @mounted="onMounted" /></div>
</template><script>export default {methods: {onMounted() {console.log('onMounted')}}}
</script>

问题解决了,但是 SonComponent 是自己写的组件,具有完全的控制权,如果是第三方组件呢?

上面的方法就无招了。

生命周期事件可以解决这个问题:

在模板上监听组件生命周期

<template><el-input @hook:mounted="onMounted" @hook:beforeDestroy="onBeforeDestroy" />
</template>
<script>export default {methods: {onMounted() {console.log('el-input onMounted')},onBeforeDestroy() {console.log('el-input onBeforeDestroy')}}}
</script>

生命周期事件在监听第三方组件的生命周期时很有用。

vue3 有类似的写法吗?

vue3 提供了 vue:hook 的写法,比如 vue:mounted

<script setup lang="ts">import {ref} from 'vue'const input = ref('')function whenMounted(params) {console.log('whenMounted')console.log(params)}function whenBeforeUnmount() {console.log('whenBeforeUnmount')}function whenUpdated() {console.log('whenUpdated')}
</script><template><el-input v-model="input" @vue:mounted="whenMounted" @vue:beforeUnmount="whenBeforeUnmount" @vue:updated="whenUpdated" />
</template>

this.$oncethis.$on 不再支持,可使用第三方库解决。

这些生命周期时间抛出的数据是组件的 vNode 对象。

jsx 中如何监听 vue3 组件的生命周期事件呢?

vue3 提供了 onVnodeXXX 方法,可以监听组件的生命周期事件。

onVnodeMountedonVnodeBeforeUnmountonVnodeUpdated 等。

export default function MyButton(props, { slots }) {function onVnodeMounted(vnode) {console.log('vnode mounted', vnode)}return (<button onVnodeMounted={onVnodeMounted}>{{default: () => slots.default?.() ?? '按钮',}}</button>)
}

在模板中也是能使用这些方法的,但是不推荐,使用 @vue:hook 更直观。

vue:hookonVnodeXXX 在 vue3 的文档中没有找到,说明这些 API 可能不稳定,不要频繁使用它们。

vue3 父组件组件的生命周期的执行顺序是什么?

vue3 的生命周期执行顺序是:

首次渲染

parent setup
parent onBeforeMount
parent vue:beforeMountson setupson onBeforeMountson vue:beforeMountson onMountedson vue:mounted
parent onMounted
# 类似两个圈,或者洋葱模型
# 父组件挂载阶段先进入后挂载

挂载阶段

销毁

Parent onBeforeUnmountSon vue:beforeUnmount # !生命周期事件先触发Son onBeforeUnmountSon onUnmountedSon vue:unmounted # ! 生命周期事件后触发
Parent onUnmounted
# 也类似洋葱模型

挂载阶段

更新

Parent onBeforeUpdateSon onBeforeUpdateSon vue:beforeUpdateSon updatedSon vue:updated
Parent onUpdated
# 也类似两个圈 父组件先进入更新阶段,后更新

挂载阶段

规律:父子组件的生命周期执行顺序类似一个两个圈,setup beforeXXX 在前方,XXXed 在后方,子组件的圈在内部。

生命周期事件在相应的生命周期钩子执行后触发,但是 vue:beforeUnmount 先于 onBeforeUnmount 执行,这点特殊。

小结

  • vue2 监听生命周期事件的方式:@hook:lifeHook
  • vue3 的方式 @vue:hook或者onVnodeHook
  • vue3 vue组件每个阶段的生命周期执行顺序是两个圈,setup beforeXXX 在前方,XXXed 在后方,子组件的圈在内部。

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

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

相关文章

边缘计算和云计算的区别

边缘计算和云计算是两种不同的计算范式&#xff0c;它们在数据处理、响应时间、网络带宽、安全性等方面有着显著的区别。下面分别介绍这两种计算方式的特点&#xff1a; ### 云计算&#xff08;Cloud Computing&#xff09; 云计算是一种通过互联网提供计算资源&#xff08;如服…

00 - React 基础

1. React 基础 JSX JSX 是一种 JavaScript 的语法扩展&#xff0c;类似于 XML 或 HTML&#xff0c;允许我们在 JavaScript 代码中编写 HTML。 const element <h1>Hello, world!</h1>;组件 组件是 React 应用的核心&#xff0c;可以是函数组件或类组件。 函数…

DataBase 的一些规范 ?

1命名规范 1.1表名要有业务意义 1.2避免使用关键字 mysql关键字 1.3库、表、字段全部采用小写 1.4命名&#xff08;包括表名、列名&#xff09;禁止超过 30 个字符 1.5临时库、表名必须以 tmp 为前缀&#xff0c;并以日期为后缀&#xff1b;如&#xff1a;tmp_shop_info_2…

如何在Java中进行单元测试:JUnit 5的使用指南

如何在Java中进行单元测试&#xff1a;JUnit 5的使用指南 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 单元测试是软件开发中的一个关键环节&#xff0c;它…

贪心算法练习题(2024/6/18)

什么是贪心 贪心的本质是选择每一阶段的局部最优&#xff0c;从而达到全局最优。 贪心算法一般分为如下四步&#xff1a; 将问题分解为若干个子问题找出适合的贪心策略求解每一个子问题的最优解将局部最优解堆叠成全局最优解 1分发饼干 假设你是一位很棒的家长&#xff0c…

pytest测试框架pytest-rerunfailures插件重试失败用例

Pytest提供了丰富的插件来扩展其功能&#xff0c;介绍下插件pytest-rerunfailures &#xff0c;用于在测试用例失败时自动重新运行这些测试用例。 pytest-rerunfailures官方显示的python和pytest版本限制&#xff1a; Python 3.8pytest 7.2 或更新版本 此插件可以通过以下可…

Scala运算符及流程控制

Scala运算符及流程控制 文章目录 Scala运算符及流程控制写在前面运算符算数运算符关系运算符赋值运算符逻辑运算符位运算符运算符本质 流程控制分支控制单分支双分支多分支 循环控制for循环while循环循环中断嵌套循环 写在前面 操作系统&#xff1a;Windows10JDK版本&#xff…

1027. 方格取数

Powered by:NEFU AB-IN Link 文章目录 1027. 方格取数题意思路代码 1027. 方格取数 题意 某人从图中的左上角 A 出发&#xff0c;可以向下行走&#xff0c;也可以向右行走&#xff0c;直到到达右下角的 B 点。 在走过的路上&#xff0c;他可以取走方格中的数&#xff08;取…

ESP32-C3模组上跑通NVS(7)

接前一篇文章:ESP32-C3模组上跑通NVS(6) 上一回讲到乐鑫技术支持发来了操作自定义NVS分区的代码。本回就对于代码进行详细解析,并通过此过程看一下具体应如何进行正确的操作。下边就开始代码分析: 主函数 主函数即app_main()代码如下: void app_main(void) {esp_err_t…

FOC方案大合集!

获取链接&#xff01;&#xff01;&#xff01; 本次小编给大家带来了一份FOC的方案大合集。此套方案是基于峰岹科技FU68系列MCU的系列方案&#xff0c;包含常用的无感&#xff0c;有感无刷电机的应用&#xff0c;每份方案都包含了原理图&#xff0c;PCB&#xff0c;代码文件&…

【TOOL】ceres学习笔记(一) —— 教程练习

文章目录 一、Ceres Solver 介绍二、Ceres 使用基本步骤1. 构建最小二乘问题2. 求解最小二乘问题 三、使用案例1. Ceres Helloworld2. Powell’s Function3. Curve Fitting4. Robust Curve Fitting 一、Ceres Solver 介绍 Ceres-solver 是由Google开发的开源C库&#xff0c;用…

2024年P气瓶充装证模拟考试题库及P气瓶充装理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年P气瓶充装证模拟考试题库及P气瓶充装理论考试试题是由安全生产模拟考试一点通提供&#xff0c;P气瓶充装证模拟考试题库是根据P气瓶充装最新版教材&#xff0c;P气瓶充装大纲整理而成&#xff08;含2024年P气瓶…

[Open-source tool]Uptime-kuma的簡介和安裝於Ubuntu 22.04系統

[Uptime Kuma]How to Monitor Mqtt Broker and Send Status to Line Notify Uptime-kuma 是一個基於Node.js的開軟軟體&#xff0c;同時也是一套應用於網路監控的開源軟體&#xff0c;其利用瀏覽器呈現直觀的使用者介面&#xff0c;如圖一所示&#xff0c;其讓使用者可監控各種…

vue3父组件获取子组件的实例对象

一&#xff0c;ref 在父组件的模板里&#xff0c;对子组件的标签定义ref属性&#xff0c;并且设置属性值&#xff0c;在方法里获取ref()获取实例对象。 父组件&#xff1a; <template><div ><div>我是父组件</div><<SonCom ref"sonComRe…

Oracle中生僻汉字的解决办法

在Oracle数据库中处理生僻汉字时&#xff0c;主要面临的问题是某些字符集可能无法完全支持所有的汉字&#xff0c;特别是生僻字。以下是一些解决Oracle中生僻汉字问题的办法&#xff1a; 检查当前字符集&#xff1a; 使用SELECT USERENV(language) FROM dual;命令来查看当前数…

jlink使用记录

https://www.eet-china.com/mp/a79854.html Jlink使用技巧之读取STM32内部的程序stm32芯片解除写保护方法&#xff08;详细&#xff09;_stm32进入写保护如何用segger恢复-CSDN博客 stm32芯片解除写保护方法&#xff08;详细&#xff09; keil程序和jlink两种ccs使用Jlink调试时…

足底筋膜炎的症状

足底筋膜炎是足底的肌腱或者筋膜发生无菌性炎症所致&#xff0c;其症状主要包括&#xff1a; 1、疼痛&#xff1a;这是足底筋膜炎最常见和突出的症状。疼痛通常出现在足跟或足底近足跟处&#xff0c;有时压痛较剧烈且持续存在。晨起时或长时间不活动后&#xff0c;疼痛感觉尤为…

从0到1 Python基础

从0到1 Python基础 文章目录 从0到1 Python基础语法基础流程控制列表与元组字符串字典与集合初始函数**数学计算**日期时间 语法基础 变量&#xff1a;一个可以改变的量 &#xff08;1&#xff09; 变量的命名规则&#xff1a;变量由字母、数字与下划线组成&#xff1b;第一个字…

高通安卓12-安卓系统定制2

将开机动画打包到system.img里面 在目录device->qcom下面 有lito和qssi两个文件夹 现在通过QSSI的方式创建开机动画&#xff0c;LITO方式是一样的 首先加入自己的开机动画&#xff0c;制作过程看前面的部分 打开qssi.mk文件&#xff0c;在文件的最后加入内容 PRODUCT_CO…

Python | Leetcode Python题解之第174题地下城游戏

题目&#xff1a; 题解&#xff1a; class Solution:def calculateMinimumHP(self, dungeon: List[List[int]]) -> int:n, m len(dungeon), len(dungeon[0])BIG 10**9dp [[BIG] * (m 1) for _ in range(n 1)]dp[n][m - 1] dp[n - 1][m] 1for i in range(n - 1, -1, …