第十六节:带你梳理Vue2: 生命周期与钩子函数

前沿:
通过前面几节的学习,我们已经对vue有了初步的了解,大致了解了vue可以帮我们干什么,
那么接下来我们就来看看vue的生命周期和它常用的钩子函数,

1. 理解生命周期的含义

生命周期:就是一个组件从实例化创建并添加到DOM树开始 ,一直到组件被销毁的整个过程 。

生命周期函数(钩子函数): 就是在Vue生命周期的整个过程的不同阶段被调用的函数


2. 生命周期图

首先来看一下官网对于vue生命周期的图解, 官网上目前有8个生命周期函数,
还有两个我们之后再看. 先看看基本的8个钩子函数

生命周期图.png


3. 钩子函数的理解

通过打断点的方式,让我们好好理解生命周期的钩子函数, 你们也可以自己复制代码进行测试好好理解Vue的钩子函数

<script>new Vue({el: "#app",data:{},methods:{},// 1. 在实例化之前被调用 beforCreate: function(){// 这个方法的时候data还没有加载,所以此方法用不到// 一般不会在这里处理什么事情alert("组件实例化之前执行的函数");debugger;}// 2. 实例化初始之后,被添加到DOM元素之前触发created: function(){// 可以在这里发送ajax,初始化操作alert("组件实例化完毕,但页面还未显示");debugger;}// 3. 在元素(虚拟DOM)已经准备好被添加到DOM,但是还没有添加时触发beforeMount: function(){// 要保证有el,或者vm.$mount() 否则这里不会执行alert("组件挂载前,但页面还未显示,但是虚拟DOM已经配置");debugger;}// 4. 会在元素创建后触发mounted: function(){//  如果有template属性模板,会用模板替换外部的el,只要有此属性,直接卸载外部el找中的内// 这将没有任何意义了//  template只能有一个更元素,不能是文本节点, // 真实的dom渲染完了,可以操作dom了alert("组件挂载后,此方法执行后,页面显示");debugger;}// 5. 在数据更新将要对DOM做一些修改时触发beforeUpdate: function(){//  当页面依赖的数据发生变化时才执行,一般用watch来替换,这个方法不好用// 页面依赖的数据发生变化,数据已变化,页面还没有渲染alert("组件更新前,但页面还未显示,但是虚拟DOM已经配置");debugger;}// 6. 后在DOM的更新已经完成后触发updated: function(){// 重新渲染页面后执行, 可以操作DOM了alert("组件更新后,此方法执行后,页面显示");debugger;},// 7. 在组件即将被销毁并且从DOM上移出时触发beforeDestroy: function(){//没什么意义,死了就什么都干不了了alert("组件销毁前");debugger;}// 8. 组件被销毁后触发destroyed: function(){alert("组件销毁");debugger;}})
</script>

实践是检验道理的唯一标准,
这里只能通过注释来介绍一下vue的钩子函数的意义。
想要详细了解还需要你亲自测试体会

生命周期钩子的 this 上下文指向调用它的 Vue 实例。


通过这张生命周期图,我们发现我们之前还有一些内容没有测试到,
诸如使用$mount绑定DOM元素, 实例化时自定义template模板等,那么接下来就好好测试这些,生命周期图所讲述的内容


4. 绑定节点

我们之前学到一直是使用vue配置对象里的el来绑定DOM节点

生命周期图告诉我们,如果我们没有el属性就会查找vue实例对象有没有通过$mount方法来绑定DOM元素
其实就算你是用el绑定了DOM元素,在Vue源码中也是会转为$mount处理

<div id="app"><div v-html="msg"></div>
</div>
<div id="haha"></div><script>const vm = new Vue({el:"#app",data: {msg:"hello"},})vm.$mount("#haha")
</script>

同时我们还会发现,如果el$mount都存在,绑定的元素有差异,那么以el为主,
因为生命周期图告诉我们只有当el属性不存在的时候,才会查看$mount方法


5. template模板编译

我们之前学习一直使用的都是没有template模板的, 根据生命周期图显示,如果我们没有template,模板,我们就会将el 属性对应的挂载点作为我们的模板

如果有template模板,我们就会用以后的模板替换之前的模板

<div id="app">{{ msg }}
</div><script>const vm = new Vue({el:"#app",template:"<div id='haha'>我是小当家</div>",data: {msg:"hello"},})
</script>

5.1 注意template模板里只能有一个根标签

所以下面的写法会报错,是错误的写法

const vm = new Vue({template:`<div id='haha'>我是小当家</div><span></span>`,data: {msg:"hello"},
})

5.2 改变数据绑定的位置

如果有template 模板,我们动态绑定的数据,就需要在模板中绑定

<div id="app">{{ msg }}
</div><script>const vm = new Vue({el:"#app",template:"<div id='haha'>我是小当家{{ msg }}</div>",data: {msg:"hello"},})
</script>

6. 关于mounted钩子函数中获取DOM元素的问题

6.1 正常在mounted钩子函数里获取DOM

<div id="app"><div v-html="msg"></div>
</div><script>const vm = new Vue({el:"#app",data: {msg:"<h2 id='box'>hello</h2>"},mounted(){console.log("mounted:");console.log(box);},})
</script>

我们会发现获取DOM元素完全没有问题,


6.2 更改DOM节点内容

如果我们动态的修改了DOM节点,那么我们再获取看看

<div id="app"><div v-html="msg"></div>
</div>
<script>const vm = new Vue({el:"#app",data: {msg:"<h2 id='box'>hello</h2>"},mounted(){// 动态修改DOM 节点this.msg = `<h2 id="box">你好</h2>`// 获取DOM 节点console.log(box);},})
</script>

这是我们就会发现我们获取的还是原先的DOM节点, 此时去获取节点内容就会有问题,
获取的DOM节点并不是更改后最新的DOM节点


6.3 解决动态DOM 节点的问题

我们可以使用$nextTice来解决此类问题

在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的 DOM。

$nextTick(),是将回调函数延迟在下一次dom更新数据后 调用,简单的理解是:数据更新后,在dom重新渲染完毕,自动执行该函数,

通过$nextTick 方法来异步操作vue实例

示例:

<div id="app"><div v-html="msg"></div>
</div>
<script>const vm = new Vue({el:"#app",data: {msg:"<h2 id='box'>hello</h2>"},mounted(){// 动态修改DOM 节点this.msg = `<h2 id="box">你好</h2>`// 获取DOM 节点console.log(box);// 通过$nextTick异步处理方法来获取就会得到最新的值this.$nextTick(() => {console.log(box);})},})
</script>

上面的示例,我们打印了2次box ,box是DOM元素的id,可以用来获取DOM元素, 但是此时两次获取的DOM元素展示的结果不一样

$nextTick.png

第一次获取box虽然数据已经改变, 页面也准备重新渲染新的DOM元素, 但是此时DOM还没有更新完成,就获取box,获取的就是原来的DOM元素内容, $nextTick方法会在DOM元素更新完成以后才会触发回调函数,在回调函数中获取的box才是更改后最新的DOM元素


建议在组件学习后再回来看:
带有子组件的示例:

<div id="app"><child ref="child"></child>
</div><template id="child"><div><span v-for="a in arr">{{a}}</span></div>
</template><script>var vm = new Vue({   // 根实例el: '#app',data: {radio: 'home'},mounted() {console.log(1);     // 在执行父组件的mounted// console.log(this.$refs.child.$el.innerHTML);// 这里打印的是 1,2,3的数组// 这里可以选择$nextTick方法,这个是在页面渲染完毕后执行this.$nextTick(() => {console.log(this.$refs.child.$el.innerHTML);  // 这个时候才4,5,6})},components: {child: {template: '#child',data() {return { arr: [1, 2, 3] }},mounted() {console.log(2);    // 先打印子组件的mountedthis.arr = [4, 5, 6]; // 说明这里mounted是异步的}}}});
</script>

显示结果

带组件的示例.png

通过实例发现,是不是用$nextTick方法在组件数据更新以后获取的DOM元素的内容都不一样

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

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

相关文章

读论文 | Small object detection model for UAV aerial image based on YOLOv7

目录 1、前言 2、摘要 3、论文的方法 3.1 方法描述 3.2 方法改进 3.3 本论文的模型图 3.4 本文的数据集&#xff1a; 3.5 论文实验 3.6 解决的问题 3.7 论文总结 &#xff08;1&#xff09;文章优点 &#xff08;2&#xff09;方法创新点 &#xff08;3&#xff0…

地质考察AR远程交互展示系统辅助老师日常授课

广东这片充满活力的土地&#xff0c;孕育了一家引领ARVR科技潮流的杰出企业——深圳华锐视点&#xff0c;作为一家专注于VR/AR技术研究与业务开发的先锋公司。多年来&#xff0c;我们不断突破技术壁垒&#xff0c;将AR增强现实技术与各行各业的实际需求完美结合&#xff0c;助力…

Cloneable接口和深拷贝

在java中如何对对象进行拷贝呢&#xff1f;我们可以使用Object类中的clone方法。 一、浅拷贝 在使用clone方法对对象进行拷贝的时候&#xff0c;需要注意&#xff1a; 1.需要重写clone方法&#xff1b; 2.clone方法的返回值是Object类&#xff0c;需要强制类型转化&#xf…

部门来了个测试开发,听说是00后,上来一顿操作给我看蒙了...

公司新来了个同事&#xff0c;听说大学是学的广告专业&#xff0c;因为喜欢IT行业就找了个培训班&#xff0c;后来在一家小公司实习半年&#xff0c;现在跳槽来我们公司。来了之后把现有项目的性能优化了一遍&#xff0c;服务器缩减一半&#xff0c;性能反而提升4倍&#xff01…

阅读笔记——《ProFuzzBench: A Benchmark for Stateful Protocol Fuzzing》

【参考文献】Natella R, Pham V T. Profuzzbench: A benchmark for stateful protocol fuzzing[C]//Proceedings of the 30th ACM SIGSOFT international symposium on software testing and analysis. 2021: 662-665.【注】本文仅为作者个人学习笔记&#xff0c;如有冒犯&…

C++面向对象的第二大特性:继承

1.继承的介绍 首先容我先向大家举一个列子: 我这里定义了一个Person的类 class Person { protected:string name;int age;string address;}; 在这个基础上&#xff0c;我要定义一个关于Student , Worker 的类 由于Student Worker都具有Person类中的成员变量 &#xff0c…

力扣--字符串58.最后一个单词的长度

思路分析 初始化变量: num 用于记录当前单词的长度。before 用于记录上一个单词的长度。 遍历字符串: 如果字符不是空格&#xff0c;增加 num 计数。如果字符是空格&#xff0c;检查 num 是否为 0&#xff1a; 如果 num 为 0&#xff0c;说明之前没有记录到单词&#xff0c;所以…

嵌入式学习——3——UDP TFTP简易文件传输

tftp协议概述 简单文件传输协议&#xff0c;适用于在网络上进行文件传输的一套标准协议&#xff0c;使用UDP传输 特点&#xff1a; 是应用层协议 基于UDP协议实现 数据传输模式 octet&#xff1a;二进制模式&#xff08;常用&#xff09; mail&#xff1a;已经不再支持 TFTP通信…

Qt学习记录(14)线程

前言&#xff1a; 我的臀部已经翘到可以顶起一屁股债了 为什么要使用线程 什么时候用线程 复杂的数据处理 头文件.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTimer>//定时器头文件QT_BEGIN_NAMESPACE namespace Ui { class Widget; }…

Python+Flask+Pandas怎样实现任意时间范围的对比数据报表

话不多说,有图有源码: 1.上图 2.因为是低代码的,只能发重要有用的代码片段了 实现思路:1)获取指定时间范围内的数据:2)df合并 #----------年份替换----------------for syear in range(int(byear),int(eyear)1):start_datestr(syear)strbdate[4:]end_datestr(syear)stredate…

【大数据】MapReduce JAVA API编程实践及适用场景介绍

目录 1.前言 2.mapreduce编程示例 3.MapReduce适用场景 1.前言 本文是作者大数据系列专栏的其中一篇&#xff0c;前文我们依次聊了大数据的概论、分布式文件系统、分布式数据库、以及计算引擎mapreduce核心概念以及工作原理。 书接上文&#xff0c;本文将会继续聊一下mapr…

光源亮度检测应用笔记

光源亮度检测应用笔记 光电检测应用光电二极管等效模型和基本参数连接并联电阻&#xff08;RJ&#xff09;串联电阻&#xff08;RS&#xff09;结电容&#xff08;CJ&#xff09;暗电流&#xff08;ID&#xff09; 光电二极管电流-电压转换器无源光电二极管电流-电压转换器有源…

C++ Primer 第五版 第十三章 拷贝控制

当定义一个类时&#xff0c;我们显式地或隐式地指定在此类型的对象拷贝、移动、赋值和销毁时做什么。一个类通过定义五种特殊的成员函数来控制这些操作&#xff0c;包括&#xff1a;拷贝构造函数&#xff08;copy constructor&#xff09;、拷贝赋值运算符&#xff08;copy-ass…

柯桥职场人出差必备的商务口语-职场差旅口语提问篇

May I reconfirm my flight? 我可以确认我的班机15857575376吗&#xff1f; Where can I make a reservation? 我到哪里可以预订&#xff1f; Do I have to make a reconfirmation? 我还要再确认吗&#xff1f; Is there any discount for the USA Railpass? 火车通行…

node.js —— 解读http模块

目录 http模块&#xff1a; http模块的引入&#xff1a; 创建web服务器的基本步骤&#xff1a; web服务器的一些基本属性&#xff1a; 上述知识汇总案例&#xff1a; http模块&#xff1a; http模块的引入&#xff1a; const http require (http) 创建web服务器的基本步骤…

探索未来,与移动云共舞

探索未来&#xff0c;与移动云共舞 在数字化飞速发展的今天&#xff0c;云计算已经成为企业、政府乃至个人用户不可或缺的一部分。而在众多云服务提供商中&#xff0c;移动云凭借其独特的优势&#xff0c;为用户带来前所未有的体验。接下来&#xff0c;让我们一起走进移动云的世…

LeetCode题练习与总结:从中序与后序遍历序列构造二叉树--106

一、题目描述 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 输入&#xff1a;inorder [9,3,15,20,7], postorder [9,15,7,20,3] 输出…

等保三级云防火墙正版--免费部署满足要求

正版授权内部部署配置授权免费 1、超时退出 2、病毒防护 3、防火墙策略 4、密码复杂度和登录失败处理 5、特征库 点赞关注 私信获取 获取授权 Q 8-5-0-3-4-7-3-3-5

MCU复位电路

【单片机复位电路&#xff0c;巧妙的RC无处不在。】https://www.bilibili.com/video/BV1XW4y1571r?vd_source3cc3c07b09206097d0d8b0aefdf07958 左侧的RESET引脚正常情况下是低电平&#xff0c;是高电平复位&#xff1b;右侧的RESET引脚正常情况下是高电平&#xff0c;是低电…

【电源专题】什么是局部放电(Partial Discharge)

什么是局部放电? 当电压施加在含有两个以上绝缘材料的绝缘物体时,有一个绝缘材料发生放电且至少仍有一个绝缘材料维持正常的绝缘状态,此放电现象称之为局部放电(Partial Discharge)。 举例来说,当待测物的绝缘材料中存在异常气隙,因为空气的介电系数比绝缘材料低以及空气的…