Vue生命周期概述

news2024/11/19 4:40:57

Vue生命周期概述

  • 1 概述
  • 2 初始阶段
  • 3 挂载阶段
  • 4 更新阶段
  • 5 销毁阶段
  • 6 总结

1 概述

每个Vue组件实例在创建时都需要经历一系列的初始化步骤,比如设置好数据侦听,编译模板,挂载实例到DOM,以及在数据改变时更新DOM。在此过程中,它也会运行被称为生命周期钩子的函数,让开发者有机会在特定阶段运行自己的代码。

Vue的声明周期包括:

  • 初始阶段
  • 挂载阶段
  • 更新阶段
  • 销毁阶段

下面用官网的声明周期图来解释说明:
在这里插入图片描述

2 初始阶段

初始阶段的生命周期有:beforeCreatecreated,相应流程如图所示:
在这里插入图片描述

  • 创建Vue实例之后,首先会初始化生命周期和事件,但是这时数据代理还未开始,也就是说vm上面还没有_data属性,那么data中定义的数据接收不到
  • 执行beforeCreate生命周期函数
  • 紧接着数据初始化,数据监测与数据代理。这个过程,要定义data数据、方法等,此时可以通过vm访问到data中的数据和methods中的方法
  • 执行created生命周期函数

下面来进行验证,首先定义如下所示HTML结构:

<div id="app">
    <button @click="add">点击+1</button>
    <span>{{number}}</span>
</div>

接着初始化一个Vue实例,在data中定义number的值,并在methods中定义方法add

const vm = new Vue({
    el: "#app",
    data: {
        number: 0 // 初始化number为0
    },
    methods: {
        add() { // 每次点击number加1
            this.number++;
        }
    },
})

首先验证beforeCreate,由于这时还没有进行数据代理,因此vm上面没有_datamethods中的方法,我们可以输出一个this来查看:

beforeCreate() {
    console.log(this);
}

输出结果如下,我们可以看到这时的vm上面即没有data,也没有methods
在这里插入图片描述
紧接着验证created,此时进行了数据监测与数据代理,因此可以通过vm访问到_datamethods中的方法,我们可以输出一个this来查看:

created() {
    console.log(this);
}

输出结果如下,这是vm上面有了add方法和在data中定义的number数据:
在这里插入图片描述
完整验证代码如下:

<div id="app">
    <button @click="add">点击+1</button>
    <span>{{number}}</span>
</div>
<script>
    const vm = new Vue({
        el: "#app",
        data: {
            number: 0
        },
        methods: {
            add() {
                this.number++;
            }
        },
        beforeCreate() {
            console.log(this);
        },
        created() {
            console.log(this);
        },
    })
</script>

3 挂载阶段

挂载阶段的生命周期有:beforeMountmounted

created执行完之后,接下来会判断是否有el的配置项,el配置项就是我们最先开始在Vue实例中定义的el: "#app"

  • 如果没有,那么会等待调用vm.$mount(el)方法,如果一直不调用该方法,渲染会停止;调用vm.$mount(el)之后,才会继续判断是否有template配置项;
  • 如果有,则会继续判断是否有template配置项,如果有该配置,编译template里面的内容;如果没有,编译el的外部html作为模版;

在这里插入图片描述
上面这个阶段Vue会开始解析模版,生成虚拟DOM,但是页面还不能显示解析好的内容,这时的流程是:
在这里插入图片描述

  • 执行beforeMount生命周期函数
  • 接下来将虚拟DOM转化为真实DOM,并往vm.$el存了一份,并且将真实DOM插入到了页面上
  • 执行mounted生命周期函数

下面来进行验证,首先验证beforeMount,在该函数执行时,Vue生成了虚拟DOM,但是页面不能显示解析好的内容,因此我们写了什么代码,页面上就显示什么代码,并且该函数中所有对DOM的操作都不生效,使用debugger调试如下:

beforeMount() {
	document.querySelector("button").innerText = "橘猫吃不胖";
    debugger;
}

结果如下,可以看到这时页面上的{{number}}还没有被解析,并且按钮的文字被改成了橘猫吃不胖
在这里插入图片描述
但是当我们继续执行下去的时候,发现按钮的文字又变回了点击+1,由此可以看出beforeMount中对DOM的操作没有生效:
在这里插入图片描述
接着验证mounted,在这个函数中,我们可以输出this.$el,结果是真实DOM:

mounted() {
    console.log(this.$el);
}

在这里插入图片描述
完整验证代码如下:

<div id="app">
    <button @click="add">点击+1</button>
    <br>
    <span>{{number}}</span>
</div>
<script>
    const vm = new Vue({
        el: "#app",
        data: {
            number: 0
        },
        methods: {
            add() {
                this.number++;
            }
        },
        beforeMount() {
            document.querySelector("button").innerText = "橘猫吃不胖";
            debugger;
        },
        mounted() {
            console.log(this.$el);
        },
    })
</script>

4 更新阶段

更新阶段的生命周期有:beforeUpdateupdated,相应流程如图所示:
在这里插入图片描述

  • 当状态数据发生了变化之后,会执行beforeUpdate生命周期函数,此时数据是最新的,但是页面是旧的
  • 紧接着新旧虚拟DOM会进行对比,并完成页面的更新
  • 执行updated生命周期函数

数据更新时,会循环执行上面的流程。

下面验证一下。首先验证beforeUpdate,在这个函数中,数据是最新的,但是没有更新到页面上,因此我们可以通过点击按钮来更新数据,观察变化:

beforeUpdate() {
    console.log(this.number);
    debugger;
}

效果如下,我们可以看到点击按钮之后,这时的number是1,但是页面上显示的还是0,因此页面尚未和数据保持同步。
在这里插入图片描述
如果我们在函数中同样使用以上代码,我们就可以看到更新后的数据和页面了:

updated() {
    console.log(this.number);
    debugger;
}

在这里插入图片描述
完整验证代码如下:

<div id="app">
    <button @click="add">点击+1</button>
    <br>
    <span>{{number}}</span>
</div>
<script>
    const vm = new Vue({
        el: "#app",
        data: {
            number: 0
        },
        methods: {
            add() {
                this.number++;
            }
        },
        beforeUpdate() {
            console.log(this.number);
            debugger;
        },
        updated() {
            console.log(this.number);
            debugger;
        },
    })
</script>

5 销毁阶段

销毁阶段的生命周期有:beforeDestroydestroyed,流程如下:
在这里插入图片描述

  • vm.$destroy()被调用时进入销毁阶段
  • 执行beforeDestroy生命周期函数
  • 移除所有的监视、子组件和事件监听器
  • 执行destroyed生命周期函数

6 总结

在这里插入图片描述

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

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

相关文章

微服务门神-网关了解

引言 书接上篇 微服务守护神-Sentinel-其他 &#xff0c;讲完微服务守护神-Sentinel之后&#xff0c;接下来就是微服务门神-网关组件&#xff1a;Gateway 问题引入 小伙伴们都知道在微服务架构中&#xff0c;一个系统会被拆分为很多个微服务&#xff0c;每一个微服务都能对外…

风电场数字孪生的应用案例

在我国“十四五”现代能源中明确规划&#xff0c;要大规模发展风电能源。与此同时电力行业也在加紧通过数字孪生等新一代信息技术推动电力能源行业智能化改造和数字化建设&#xff0c;不夸张地说数字孪生技术&#xff0c;数字孪生的应用不仅能够提高风电场项目建设的设计、施工…

PPa-GO/NPs/PEG/DSPE焦脱镁叶绿酸-a修饰氧化石墨烯/纳米粒子/聚乙二醇/磷脂/细胞膜合成

小编分享了PPa-GO/NPs/PEG/DSPE焦脱镁叶绿酸-a修饰氧化石墨烯/纳米粒子/聚乙二醇/磷脂/细胞膜合成方法相关知识&#xff0c;来学习&#xff01; 焦脱镁叶绿酸-a衍生物合成方法: 通过酸解反应从叶绿素a得到焦脱镁叶绿酸a,羧基保护后插入Zn2形成金属配合物,采用2,3-二氯-5,6-二氰…

window.open跳转页面传参接参

<el-table-column fixed"right" header-align"center" align"center" prop"action" label"操作" width"180px"><template slot-scope"scope"><el-button type"primary" size&…

QT学习笔记(上)

QT学习笔记&#xff08;上&#xff09; 文章目录QT学习笔记&#xff08;上&#xff09;1. 窗口和按钮2. 创建一个自定义的QPushButton2.1 mypushbutton.h2.2 mypushbuttion.cpp2.3 mainwindow.cpp引用mypushbutton3. QT坐标原点4. 信号与槽5. 自定义信号和槽6. 信号和槽的重载P…

基于java(SSH)的数字迎新系统的设计与实现

目 录 摘 要 i Abstract ii 1 绪论 1 1.1 选题背景 1 1.2研究现状 1 1.3课题目的 1 1.4本文结构 2 2 设计技术与开发环境 3 2.1 相关技术介绍 3 2.1.1 Struts简介 3 2.1.2 Hibernate简介 3 2.1.3 spring简介 3 2.2.4 SSH的简介 3 2.2 开发环境介绍 5 2.2.1 Myeclipse简介 5 2.2…

linux只W25Q256驱动,使用m25p80,支持w25q系列nor flash

1.内核编译选项增加 (1&#xff09;Device Drivers/Memory Technology Device (MTD) support ---> (2)Device Drivers/Memory Technology Device (MTD) support /SPI-NOR device support ---> (3)Device Drivers/Memory Technology Device (MTD) support /SPI-NOR dev…

机器学习——期末复习

文章目录填空题第一章 机器学习基础第二章 数据预处理KNN算法支持向量机集成学习决策树聚类算法联结学习三种池化操作选择题计算题数据正规化Hopfield网络能量函数计算卷积、池化操作应用题决策树、朴素贝叶斯、聚类算法单层感知器构造&#xff08;连接神经元部分&#xff09;填…

unix 域套接字实现进程间通信

目录 1、认识域套接字 2、unix域套接字相关API及地址结构介绍 (1) 创建unix域套接字 (2) 填充地址结构 sockaddr_un 3、unix域套接字实现进程间通信&#xff08;以UDP为例&#xff09; 1、认识域套接字 和之前TCP / UDP 编程使用的套接字不同&#xff0c;域套接字常用于同…

01入门及简单应用-ReentrantReadWriteLock原理-AQS-并发编程(Java)

文章目录1 概述2 性质3 简单测试4 模拟数据缓存4.1 应用初始化无缓存4.2 加入缓存改造5 后记1 概述 ReentrantReadWriteLock 是读写锁&#xff0c;和ReentrantLock会有所不同&#xff0c;对于读多写少的场景使用ReentrantReadWriteLock 性能会比ReentrantLock高出不少。在多线程…

技术分享 | 测试平台开发-前端开发之数据展示与分析

测试平台的数据展示与分析&#xff0c;我们主要使用开源工具ECharts来进行数据的展示与分析。 ECharts简介与安装 ECharts是一款基于JavaScript的数据可视化图表库&#xff0c;提供直观&#xff0c;生动&#xff0c;可交互&#xff0c;可个性化定制的数据可视化图表&#xff…

展锐Android 10平台OTA升级

OTA 整体升级包制作步骤&#xff08;以SC9863A平台为例&#xff09; 下载项目 AP 的代码。通过以下命令设置编译环境。 source build/envsetup.sh lunch kheader 通过 make 命令全编整个工程。进入“device/sprd/sharkle/sl8541e_1h10_32b/”目录&#xff08;board 对应目录&a…

5G无线技术基础自学系列 | 站点详细勘测

素材来源&#xff1a;《5G无线网络规划与优化》 一边学习一边整理内容&#xff0c;并与大家分享&#xff0c;侵权即删&#xff0c;谢谢支持&#xff01; 附上汇总贴&#xff1a;5G无线技术基础自学系列 | 汇总_COCOgsta的博客-CSDN博客 站点的勘测结果非常重要&#xff0c;直…

高压放大器在硅氧烷近晶相单体合成中的应用

实验名称&#xff1a;高压放大器在硅氧烷近晶相单体合成中的应用 研究方向&#xff1a;晶体材料 测试目的&#xff1a; 双稳态包括向列相双稳态、近晶&#xff21;相双稳态和胆甾相双稳态&#xff0c;目前主要的研究是在近晶&#xff21;相双稳态&#xff0c;由近晶&#xff21…

自动驾驶专题介绍 ———— 转向系统

文章目录转向系统转向器齿轮齿条式循环球式蜗杆曲柄指销式转向助力液压转向助力系统电动转向助力系统发展转向系统 转向系统是按照驾驶员的意图改变或保持汽车行驶方向的系统。根据转向能源的不同&#xff0c;可以将转向系统分为机械转向系统和动力转向系统。   1. 机械转向系…

188: vue+openlayers上传GeoJSON文件,导出CSV格式文件

第188个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+openlayers上传geojson文件,解析文件在地图上显示图形,同时利用上传的文件,获取features数据,整合重新配置格式,导出CSV(Comma Separated Values)形式的文件。如果文件仅包含点要素,则会添加经度和纬度列。 …

能源管理系统的主要功能|瑜岿科技|能源监测

能源管理系统利用过程控制技术、网络通信技术、教据库技术将分布在现场的数据采集监测站、现场控制站以及管理控制中心联系了起来&#xff0c;实现对企业生产数据采集、存储、处理、统计、查询及分析的功能&#xff0c;以及对企业生产数据的监控、分析和诊断&#xff0c;通过对…

Dynamic Few-Shot Visual Learning without Forgetting

摘要 人类视觉系统有显著的能力去毫不费力的从零样本示例中学习新颖概念。机器学习视觉系统上模仿相同的行为是一个有趣的非常具有挑战性的研究问题&#xff0c;这些研究问题有许多实际的优势在真实世界视觉应用上。在这篇文章中&#xff0c;我们目标是去设计一个零样本视觉学…

mysql中MVCC--多版本并发控制

读读:不存在任何安全问题&#xff0c;不需要并发控制 读写:有线程安全问题&#xff0c;脏读、幻读、不可重复读 写写:有线程安全问题&#xff0c;更新丢失 为了解决读写的并发问题 什么是MVCC 只有InnoDB引擎支持mvcc&#xff0c;mysql默认支持可重复读&#xff0c;就是依赖…

常用数据库之mysql的搭建与使用

1. 简介 mysql为关系型数据库&#xff0c;是由瑞典的MySQLAB公司开发的&#xff0c;但是几经辗转&#xff0c;现在是Oracle产品。它是以“客户&#xff0f;服务器”模式实现的&#xff0c;是一个多用户、多线程的小型数据库服务器。而且MySQL是开源数据的&#xff0c;任何人都可…