【vue系列-05】vue的生命周期(详解)

news2024/11/24 10:02:55

深入理解vue的生命周期

  • 一,vue的生命周期
    • 1,创建流程
      • 1.1,beforeCreate
      • 1.2,created
    • 2,挂载流程
      • 2.1,beforeMount
      • 2.2,mounted
    • 3,更新流程
      • 3.1,beforeUpdate
      • 3.2,updated
    • 4,销毁流程
      • 4.1,beforeDestry
      • 4.2,destroyed
  • 二,vue的生命周期总结

一,vue的生命周期

在vue的官网中,vue的生命周期如下图所示,主要经历了如下几个阶段,分别是 beforeCreate,created,beforeMount,mounted,beforeUpdate,update,beforeDestroy,destroy ,主要由这八个阶段组成。

这边的vue实例和java中的spring中的bean对象一样,都有一套完成的加载流程,以及一套完整的生命周期,vue的生命周期的总览如下图,接下来通过下面这张图片对每个阶段做一个具体的分析。
在这里插入图片描述

1,创建流程

创建流程主要由两个阶段组成,一个是beforeCreate,另一个是created。这里的创建之前和创建之后指的是 数据监测和数据代理 的创建之前和创建之后,而不是vm,因为此时的vm还并没有创建出来。
在这里插入图片描述

1.1,beforeCreate

在创建完这个Vue实例之后,首先会进入一个初始化阶段,此阶段初始化生命周期和事件,但是在此阶段,数据代理还并没有开始。在初始化阶段之后,就会经历vue的 beforeCreate 阶段,代码如下,其函数在vue实例中和这个data是平级的。

<div id="root">
    <h1>当前的值n为:{{n}}</h1>
    <button @click = "add">点我+1</button>
</div>
new Vue({
    el:'#root',
    data:{n:1},
    methods:{add(){ this.n++ }},
    beforeCreate(){
        console.log('beforeCreate');
        console.log(this);
        debugger;
    }
})

其结果如下,由于数据代理并未初始化,因此这个阶段是拿不到vm对象以及_data数据的,因此在第一个 beforeCreate 阶段中,无法通过这个vm对象访到data中的数据和methods中方法。并且在下面的结果可以的得知是并没有 _data 的,并且也没有data数据中的 n 值,也没有add方法

在这里插入图片描述

1.2,created

在beforeCreate之后,还是处于一个初始化阶段,即init Injections & reactivity 阶段。该阶段就是初始化这个数据监测和数据代理的,这样就可以获取到代理对象,解析模板了。

<div id="root">
    <h1>当前的值n为:{{n}}</h1>
    <button @click = "add">点我+1</button>
</div>
new Vue({
    el:'#root',
    data:{n:1},
    methods:{add(){ this.n++ }},
    ...
    created(){
        console.log('created');
        console.log(this);
        debugger;
    }
})

在初始化代理对象之后,就可以进入这个 created 阶段了。通过控制台的打印可以得知已经可以加载这个_data对象,由于初始化了这个数据监测,所以这个 get和set的两个方法也有了,由于初始化了这个数据代理,因此这个data中的n和method中的add都可以加载成功了,

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lzK5lKN9-1672993507324)(img/1672974112523.png)]

此时是可以通过vm对象获取到 data 中的属性和method 中的方法的。

2,挂载流程

在创建流程之后,还会有一个阶段来解析这个Vue模板,看下面的流程,就是开始解析模板,生成虚拟DOM到内存中,此时页面还不能显示好解析的内容,即还没有转成真实DOM。接下来就会进入两个挂载流程,一个是beforeMount,另一个是mounted。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pBK6yOz0-1672993507325)(img/1672975068315.png)]

接下来就是主要分析一下这两个挂载的流程以及所做的事情。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4luTyV86-1672993507325)(img/1672976012279.png)]

2.1,beforeMount

在挂载的函数上打一debugger,可以发现在执行到这这个 beforeMount 的时候,对应的页面是并没有进行解析的,因此可以初步确认这个挂载前的这个函数中的DOM元素是未经过Vue编译的,因此所有对Dom的操作都是不能奏效的。实际上这个DOM元素是Vue已经解析完成的真实DOM,但是此时的vue还没来的及将这些DOM向页面中存放。

<div id="root">
    <h1>当前的值n为:{{n}}</h1>
    <button @click = "add">点我+1</button>
</div>
new Vue({
	el:'#root',
    data:{n:1},
    methods:{add(){ this.n++ }},
    ...
    beforeMount(){
        console.log('beforeMount');
        console.log(this);
        debugger;
    }
})

通过这个debugger的断点,此时的页面如下,可以发现页面上的值是原生的html,并不是经历过vue模板解析的值,因此可以得知上面还没有vue解析出来的DOM,同时也可以证明此时vue还没有来得及将编译的DOM存到页面中

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-87zvzmYi-1672993507326)(img/1672976227925.png)]

2.2,mounted

在经过这个 beforeMount 的阶段之后,Vue会将el中的数据存放在 $el 上,类似于做一个副本,此时会将内存中的虚拟DOM转化为真实DOM存在页面中。

在将真实的DOM插入页面之后,Vue就会开始调用这个 mounted 挂载的这个函数了。因为页面中已经呈现的是经过Vue编译的DOM了,因此在这个函数中对DOM的操作均有效,到此为止,初始化阶段正式结束。

<div id="root">
    <h1>当前的值n为:{{n}}</h1>
    <button @click = "add">点我+1</button>
</div>
new Vue({
	el:'#root',
    data:{n:1},
    methods:{add(){ this.n++ }},
	...
	mounted(){
        console.log('mounted');
        console.log(this);
        //操作DOM元素
        document.querySelector('h1').innerText = 'zhs'
    }
})

通过上面的代码以及下面的结果可知,在挂载阶段DOM元素已经是全部经过Vue解析的,因此展示在页面的值都是解析后的值,并且在这个阶段也可以有效的操作DOM元素。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J2Omy6rE-1672993507327)(img/1672986734108.png)]

在这个挂载函数中,一般会进行这些操作:开启定时器,发送网络请求,订阅消息,绑定自定义事件等操作

3,更新流程

在挂载流程解释之后,接下来会进入更新流程,更新流程主要分为 beforeUpdate 和 updated 两个流程。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fOkgsdjn-1672993507327)(img/1672987659462.png)]

3.1,beforeUpdate

就是说只要data中的数据发生改变,那么就会触发这个钩子函数,但是在这个阶段中,页面上渲染的数据和被改变的数据没有保持同步,就是页面还没有来得及展示被修改的值

<div id="root">
    <h1 id='h1'>当前的值n为:{{n}}</h1>
    <button @click = "add">点我+1</button>
</div>
new Vue({
	el:'#root',
    data:{n:1},
    methods:{add(){ this.n++ }},
	...
	beforeUpdate(){
		//现在被修改的值
        console.log("vue实例数据是:" + this.n);
        debugger;
    }
})

通过下面的代码和下面的结果可知,vue实例中的数据和页面的数据是不一致的。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fAq2ACbs-1672993507328)(img/1672989403705.png)]

3.2,updated

在这个beforeUpdate结束之后,会经过一个 Virtual DOM re-render and patch 阶段,在这个阶段,就会生成新的虚拟DOM,随后通过diff算法,实现新旧的虚拟DOM的比较,最终完成页面的更新。

此时这个数据是新的,页面也是最新的,并且数据和页面是保持一致的。

<div id="root">
    <h1 id='h1'>当前的值n为:{{n}}</h1>
    <button @click = "add">点我+1</button>
</div>
new Vue({
	el:'#root',
    data:{n:1},
    methods:{add(){ this.n++ }},
	...
	updated(){
		console.log(updated);
		//现在被修改的值
        console.log("vue实例数据是:" + this.n);
        debugger;
    }
})

通过上面的代码和下面的结果可知,数据和页面是同步的

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6vv0z02e-1672993507329)(img/1672989477443.png)]

4,销毁流程

接下来就进入最后一个流程,销毁流程,销毁用官网的话来说:清理它与其他实例的链接,解绑他的全部指令以及时间监听器。主要是由两个部分组成,分别是 beforeDestrydestroyed

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PBFLFXyw-1672993507329)(img/1672989647317.png)]

4.1,beforeDestry

销毁需要调用这个 this.$destroy() 方法来实现。在销毁 beforeDestry 的这个函数中,销毁的实例中的所有的data,methods还有指令等等都是处于可用状态,但是不能对实例中的具体的数据和方法进行一个操作。

<div id="root">
    <button @click = "bey">点我销毁</button>
</div>
new Vue({
	el:'#root',
    data:{n:1},
    methods:{
    	bey(){this.$destroy()}
    },
	...
	beforeDestroy(){
		console.log('beforeDestry');
    }
})

4.2,destroyed

在到了这个最终的销毁方法之后,vue实例算是彻底的被销毁了,但是页面上的数据是还在的,但是不能操作上面的数据了。

...
destroyed(){
	console.log('destroyed');
}

总代码如下

<!-- 一个容器,可以用于接收vue实力传来的数据,然后展示 -->
<div id="root">
    <h1 id="h1">当前的值n为:{{n}}</h1>
    <button @click = "add">点我+1</button>
    <button @click = "bey">点我销毁</button>
</div>
<script type="text/javascript" >
    Vue.config.productionTip = false,   //阻止vue启动时提示生产提示
    new Vue({
        el:'#root',
        data:{n:1},
        methods:{
            add(){ this.n++ },
            bey(){this.$destroy()}
        },
        beforeCreate(){
            console.log('beforeCreate');
            
        },
        created(){
            console.log('created');
            
        },
        beforeMount(){
            console.log('beforeMount');
        },
        mounted(){
            console.log('mounted');
        },
        beforeUpdate(){
            console.log('beforeUpdate');
        },
        updated(){
            console.log('updated');
        },
        beforeDestroy(){
	        console.log('beforeDestry');
            console.log("vue实例准备销毁了");
        },
        destroyed(){
            console.log('destry');
            console.log("vue实例已经销毁了");
        }
    })
</script>

二,vue的生命周期总结

常用的生命周期钩子:

1,mounted:发送ajax、启动定时器、绑定自定义事件、消息订阅等初始化操作

2,beforeDestroy:清除定时器、解绑自定义事件、取消消息订阅等

销毁vue实例之后

1,借助vue开发者工具是看不到任何消息的

2,销毁后自定义事件会失效,但是原生的DOM事件依然有效

3,一般不要在beforeDestory中操作数据,因为该钩子并不会触发更新流程

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

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

相关文章

ConvNeXt V2论文翻译:ConvNeXt V2与MAE激情碰撞

文章目录摘要1 简介2 相关工作3 全卷积掩码自编码器4 全局响应归一化5 ImageNet实验6 迁移学习实验7 结论摘要 论文链接&#xff1a;ConvNeXt V2 在改进的架构和更好的表示学习框架的推动下&#xff0c;视觉识别领域在21世纪20年代初实现了快速现代化和性能提升。例如&#xf…

评价类模型(层次分析法与模糊评价模型)

一、评价类模型 综合评价的基本理论和数据预处理&#xff1a; 评价对象评价指标权重系数综合评价模型评价者 二、AHP法—层次分析法 通过打分解决评价类问题&#xff0c;两两比较&#xff0c;推算权重。 %function RIAHPRI(n) %利用MATLAB求随机一致性指标; i0;CI0;Azer…

pyqt5下的QInputDialog跟QFileDialog以及关闭主窗口子窗口自动关闭

QInputDialog 具体的参数可以参考&#xff1a; Qt&#xff1a;30---QInputDialog标准输入对话框_mb6128aabee41d4的技术博客_51CTO博客 官网连接&#xff1a; QInputDialog Class | Qt Widgets 5.15.12 这里只介绍QInputDialog.getText 代码实现&#xff1a; from PyQt5.…

【从零开始学爬虫】采集食品行业最新报价数据

l 采集网站 【场景描述】采集食品行业最新报价数据。 【源网站介绍】中国报告大厅网休闲食品行业数据频道提供休闲食品行业数据信息&#xff0c;在此有大量休闲食品行业数据信息可供选择&#xff0c;是一个可以帮助休闲食品行业了解数据的平台。 【使用工具】前嗅ForeSpider…

hbase2.x orphan regions on filesystem

问题描述&#xff1a;orphan regions on filesystem 可以通过主master web页面的HBCK Report查看 也可以通过hbck2工具查看 # 查看指定表 hbase hbck -j $HBASE_HOME/lib/hbase-hbck2-1.3.0-SNAPSHOT.jar addFsRegionsMissingInMeta default:tableName # 查看命名空间下所有…

Git分支开发中的问题

前言我们在开发中&#xff0c;经常是很多人开发同一份代码&#xff0c;早期没有git工具的时候那可真是噩梦&#xff0c;要复制来复制去&#xff0c;不止繁琐&#xff0c;还容易出错&#xff0c;所以后来涌现了各种代码工具&#xff0c;Svn&#xff0c;Git等等&#xff0c;而Git…

一、mysql基础、MySQL的安装及卸载、DML、DQL

MySQL基础 1、数据库相关概念 以前我们做系统&#xff0c;数据持久化的存储采用的是文件存储。存储到文件中可以达到系统关闭数据不会丢失的效果&#xff0c;当然文件存储也有它的弊端。 假设在文件中存储以下的数据&#xff1a; 姓名 年龄 性别 住址 张三 23 男 北京西三…

干货|app自动化测试之Andriod WebView如何测试

Hybrid App&#xff08;混合模式移动应用&#xff09;是介于 Web-app、Native-app 之间的 app&#xff0c;本质上是 Native-app 中嵌入 WebView 组件&#xff0c;在 WebView 组件里可以访问 Web App。Hybrid App 在给用户良好交互体验的同时&#xff0c;还具备了 Web App 的跨平…

Python数学建模问题总结(2)数据可视化Cookbook指南【源自Google可视化团队】

今天跟大家分享一套谷歌数据可视化团队形成的全面的数据可视化指南&#xff0c;涵盖了设计原则、图表分类、图表的选用、样式设计、交互设计、仪表板设计等方面。一、可视化问题不论你是从事数据相关工作&#xff0c;还是业务相关工作&#xff0c;或多或少都会需要用到数据可视…

docker 部署maven服务器用于项目的部署和发布

书接上文 现状: 已经搭建好了maven远程服务器,并将自己的项目从自己的pc部署到maven远程服务器.假设了kie-server集群可以每个node都连接这个远程服务器 要做的: 1.创建kie-server集群的时候设置环境变量. 2.看是否能连上自己搭建的maven服务器.3.如果2 ok 把kie-server需要…

干货|app自动化测试之Appium 原理 与 JsonWP 协议分析

想要使用 Appium 进行测试&#xff0c;那么就一定要先了解Appium的原理。Appium 不仅能够实现移动端的 JSONWP&#xff0c;并且延伸到了 Selenium 的 JSONWP&#xff0c;它能够控制不同移动设备的行为&#xff0c;例如通过会话安装和卸载 APP。Appium 原理图中依赖关系解释&…

MySQL高级 【视图】

目录 1&#xff1a;视图 1.1&#xff1a;介绍 1.2&#xff1a;语法 1.3&#xff1a;检查选项 1.4&#xff1a;视图的更新 1.5&#xff1a;视图作用 1.6&#xff1a;案例 1&#xff1a;视图 1.1&#xff1a;介绍 视图&#xff08;View&#xff09;是一种虚拟存在的表。…

一文看懂什么是「低代码」!低代码真的能取代程序员吗?

早在数年前&#xff0c;亚马逊、微软、阿里、腾讯等国内外巨头公司就已纷纷入局“低代码”赛道&#xff0c;而很多人连低代码是什么&#xff0c;究竟有什么用都不太知道。 本文就从概念讲起&#xff0c;结合三个生动的行业案例&#xff0c;一文讲通“什么是低代码”。 文章有…

【强训】Day03

努力经营当下&#xff0c;直至未来明朗&#xff01; 文章目录一、选择二、编程1. 字符串中找出连续最长的数字串2. 数组中出现次数超过一半的数字答案1. 选择2. 编程普通小孩也要热爱生活&#xff01; 一、选择 以下代码运行输出的是&#xff08;&#xff09; public class …

都2023了,为什么选择Nacos,这篇文章让你入门Nacos

&#x1f473;我亲爱的各位大佬们好&#x1f618;&#x1f618;&#x1f618; ♨️本篇文章记录的为 Nacos入门 相关内容&#xff0c;适合在学Java的小白,帮助新手快速上手,也适合复习中&#xff0c;面试中的大佬&#x1f649;&#x1f649;&#x1f649;。 ♨️如果文章有什么…

传奇开服一条龙GEE引擎登录器配置教程

1、首先我们打开我们版本文件夹找到登录器文件夹进入找到GEE登录器配置器&#xff08;MakeGameLogin.exe&#xff09;打开2、接下来开始填写我们的主列表和备列表&#xff0c;这时候我们要自己创建一个列表&#xff0c;因为登录器自带的列表肯定是读取不了的&#xff0c;我们在…

Speckle核心概念【3D数据引擎】

本节将详细介绍你的3D数据如何发送到 Speckle 并存储在 Speckle 中。 无论你是 Speckle 的新手还是只是需要复习&#xff0c;这都是一个很好的起点&#xff01; 1、关于Speckle术语 我们尽量使本指南简单明了&#xff0c;删除了技术语言&#xff0c;除非绝对必要。 值得注意的…

页面表格中每行前添加复选框,点击复选框导出本行数据(掉后端接口)

需求如下&#xff1a;html表格中&#xff0c;每行前面添加一个复选框&#xff0c;单机复选框下载/到处本行数据 思路&#xff1a; 页面&#xff1a; 页面首先要添加复选框&#xff0c;然后点击复选框&#xff0c;调用导出方法 同时获取到与它对应的数据库唯一id信息&#xf…

Seata 1.6.0 正式发布,大幅度提升存储性能

作者&#xff1a;Seata 社区 用户登记* * 欢迎已使用用户在此链接登记&#xff0c;便于我们更好的针对业务场景优化&#xff1a; https://github.com/seata/seata/issues/1246 发布概览* * 主要新增特性&#xff1a;支持 oracle 和 pgsql 多主键&#xff1b;支持 seata-ser…

芯片+步进电机档位控制实验

1、系统功能 目的&#xff1a;学习步进电机的控制。 使用设备&#xff1a;步进电机、两位共阴数码管、按键 功能&#xff1a;驱动步进电机以不同转速&#xff08;4档&#xff09;转动&#xff0c;并将当前档位用数码管显示 (1)按键 KEY1 作为启动和停止的切换按键&#xff1b;…