入门 - vue整个过程的生命周期详解

news2024/9/20 15:23:09

生命周期概念

Vue的生命周期就是vue实例从创建到销毁的全过程,也就是new Vue()开始就是vue生命周期的开始。Vue 实例有⼀个完整的⽣命周期,也就是从开始创建、初始化数据、编译模版、挂载Dom->渲染、更新->渲染、卸载 等⼀系列过程,称这是Vue的⽣命周期。钩子函数是Vue生命周期中每个阶段对外开放让程序员操作Vue的接口。Vue有8个钩子函数。

每个vue实例从创建到销毁的过程都是一个生命周期,也会运行对应的钩子函数,下图为Vue生命周期示意图:

8个钩子函数

1. beforeCreate

官方解释: 在实例初始化之后,数据观测(data observer)和event/watcher事件配置之前被调用。

说明:这个时候this还不能使用,data中的数据、methods中的方法,以及watcher中的事件都不能获得。

var vm = new Vue({
el: '#app',
data: {
    message: '今天是周五!!!'
},
beforeCreate(){
    console.group('beforeCreate 创建前状态==========>>');
    console.log("%c%s", "color:red", "el     : "+this.$el);   //undefined
    console.log("%c%s", "color:red", "data   : "+this.$data); //undefined
    console.log("%c%s", "color:red", "message: "+this.message);   //undefined
},
//...

2. created

官方解释: 实例已经创建完成之后被调用。在这一步,实例已完成以下的配置:数据观测(data observer),属性和方法的运算,watch/event 事件回调。然而,挂载阶段还没开始,$el属性目前不可见。

说明:这个时候可以操作vue中的数据和方法,但是还不能对dom节点进行操作。

//...
created(){
    console.group('created 创建完毕状态==========>>');
    console.log("%c%s", "color:red", "el     : "+this.$el);   //undefined
    console.log("%c%s", "color:red", "data   : "+this.$data); //[object Object]
    console.log("%c%s", "color:red", "message: "+this.message);   //今天是周五!!!
},

3. beforeMount

官方解释: 在挂载开始之前被调用:相关的render函数首次被调用。

说明:$el属性已存在,是虚拟dom,只是数据未挂载到模板中。

//...
beforeMount(){
    console.group('beforeMount 挂载前状态==========>>');
    console.log("%c%s", "color:red", "el     : "+this.$el);   //[object HTMLDivElement]
    console.log(this.$el);
    console.log("%c%s", "color:red", "data   : "+this.$data); //[object Object]
    console.log("%c%s", "color:red", "message: "+this.message);   //今天是周五!!!
},

4. mounted

官方解释: el被新创建的vm.$el替换,并挂载到实例上去之后调用该钩子。如果 root 实例挂载了一个文档内元素,当mounted被调用时vm.$el也在文档内。

注意mounted不会承诺所有的子组件也都一起被挂载。如果你希望等到整个视图都渲染完毕,可以用vm.$nextTick替换掉mounted

说明:挂载完毕,这时dom节点被渲染到文档内,dom操作在此时能正常进行

//...
mounted(){
console.group('mounted 挂载结束状态==========>>');
console.log("%c%s", "color:red", "el     : "+this.$el);   //[object HTMLDivElement]
console.log(this.$el);  
console.log("%c%s", "color:red", "data   : "+this.$data); //[object Object]
console.log("%c%s", "color:red", "message: "+this.message);   //今天是周五!!!
},
//...

点击页面中的元素执行相应的事件,并触发beforeUpdate和updated钩子函数。

5. beforeUpdate

官方解释: 数据更新时调用,发生在虚拟 DOM 打补丁之前。这里适合在更新之前访问现有的 DOM,比如手动移除已添加的事件监听器。

说明:beforeUpdate是指view层的数据变化前,不是data中的数据改变前触发。因为Vue是数据驱动的。

//...
beforeUpdate(){
console.group('beforeUpdate 更新前状态==========>>');
console.log("%c%s", "color:red", "el     : "+this.$el);   //[object HTMLDivElement]
console.log(this.$el);
console.log(this.$el.innerHTML);    //<p>今天是周一!!!</p>
console.log("%c%s", "color:red", "data   : "+this.$data); //[object Object]
console.log("%c%s", "color:red", "message: "+this.message);   //今天周二了!!!
},
//...

6. updated

官方解释: 由于数据更改导致的虚拟DOM重新渲染和打补丁,在这之后会调用该钩子。

当这个钩子被调用时,组件DOM已经更新,所以你现在可以执行依赖于DOM的操作。然而在大多数情况下,你应该避免在此期间更改状态。如果要相应状态改变,通常最好使用计算属性或watcher取而代之。

注意updated不会承诺所有的子组件也都一起被重绘。如果你希望等到整个视图都重绘完毕,可以用vm.$nextTick替换掉 updated:

说明:view层的数据更新后,data中的数据同beforeUpdate,都是更新完以后的。

//...
updated(){
console.group('updated 更新完成状态==========>>');
console.log("%c%s", "color:red", "el     : "+this.$el);   //[object HTMLDivElement]
console.log(this.$el);
console.log(this.$el.innerHTML);    //<p>今天周二了!!!</p>
console.log("%c%s", "color:red", "data   : "+this.$data); //[object Object]
console.log("%c%s", "color:red", "message: "+this.message);   //今天周二了!!!
},
//...

注意:细心的小伙伴会发现beforeUpdate和updated钩子函数中的$el一样,根据官方理解beforeUpdate应该指向虚拟dom,所以才会一样,而dom中的真正内容不一样,但是beforeMount和mouted钩子函数中为什么又会有区别呢?感觉是设计的不足之处。

执行vm.$destroy()函数触发beforeDestroy和destoryed钩子函数

7. beforeDestroy

官方解释: 实例销毁之前调用。在这一步,实例仍然完全可用。

说明:

//...
beforeDestroy(){
console.group('beforeDestroy 销毁前状态==========>>');
console.log("%c%s", "color:red", "el     : "+this.$el);   //[object HTMLDivElement]
console.log(this.$el);
console.log("%c%s", "color:red", "data   : "+this.$data); //[object Object]
console.log("%c%s", "color:red", "message: "+this.message);   //今天周二了!!!
},
//...

8. destroyed

官方解释: Vue实例销毁后调用。调用后,Vue实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁。

说明:执行destroy方法后,对data的改变不会再触发周期函数,此时的vue实例已经解除了事件监听以及和dom的绑定,但是dom结构依然存在。

//...
destroyed(){
console.group('destroyed 销毁完成状态==========>>');
console.log("%c%s", "color:red", "el     : "+this.$el);   //[object HTMLDivElement]
console.log(this.$el);
console.log("%c%s", "color:red", "data   : "+this.$data); //[object Object]
console.log("%c%s", "color:red", "message: "+this.message);   //今天周二了!!!
},
//...

代码如下:

<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>
<div id="app" @click="change">
    <p>{{message}}</p>
</div>
<script src="https://cdn.bootcss.com/vue/2.6.10/vue.min.js"></script>
<script type="text/javascript">
var vm = new Vue({
    el: '#app',
    data: {
        message: '今天是周五!!!'
    },
    beforeCreate(){
        console.group('beforeCreate 创建前状态==========>>');
        console.log("%c%s", "color:red", "el     : "+this.$el);   //undefined
        console.log("%c%s", "color:red", "data   : "+this.$data); //undefined
        console.log("%c%s", "color:red", "message: "+this.message);   //undefined
    },
    created(){
        console.group('created 创建完毕状态==========>>');
        console.log("%c%s", "color:red", "el     : "+this.$el);   //undefined
        console.log("%c%s", "color:red", "data   : "+this.$data); //[object Object]
        console.log("%c%s", "color:red", "message: "+this.message);   //今天是周六!!!
    },
    beforeMount(){
        console.group('beforeMount 挂载前状态==========>>');
        console.log("%c%s", "color:red", "el     : "+this.$el);   //[object HTMLDivElement]
        console.log(this.$el);
        console.log("%c%s", "color:red", "data   : "+this.$data); //[object Object]
        console.log("%c%s", "color:red", "message: "+this.message);   //今天是周六!!!
    },
    mounted(){
        console.group('mounted 挂载结束状态==========>>');
        console.log("%c%s", "color:red", "el     : "+this.$el);   //[object HTMLDivElement]
        console.log(this.$el);  
        console.log("%c%s", "color:red", "data   : "+this.$data); //[object Object]
        console.log("%c%s", "color:red", "message: "+this.message);   //今天是周五!!!
    },
    beforeUpdate(){
        console.group('beforeUpdate 更新前状态==========>>');
        console.log("%c%s", "color:red", "el     : "+this.$el);   //[object HTMLDivElement]
        console.log(this.$el);
        console.log(this.$el.innerHTML);    //<p>今天是周一!!!</p>
        console.log("%c%s", "color:red", "data   : "+this.$data); //[object Object]
        console.log("%c%s", "color:red", "message: "+this.message);   //今天周六了!!!
    },
    updated(){
        console.group('updated 更新完成状态==========>>');
        console.log("%c%s", "color:red", "el     : "+this.$el);   //[object HTMLDivElement]
        console.log(this.$el);
        console.log(this.$el.innerHTML);    //<p>今天周二了!!!</p>
        console.log("%c%s", "color:red", "data   : "+this.$data); //[object Object]
        console.log("%c%s", "color:red", "message: "+this.message);   //今天周六了!!!
    },
    beforeDestroy(){
        console.group('beforeDestroy 销毁前状态==========>>');
        console.log("%c%s", "color:red", "el     : "+this.$el);   //[object HTMLDivElement]
        console.log(this.$el);
        console.log("%c%s", "color:red", "data   : "+this.$data); //[object Object]
        console.log("%c%s", "color:red", "message: "+this.message);   //今天周六了!!!
    },
    destroyed(){
        console.group('destroyed 销毁完成状态==========>>');
        console.log("%c%s", "color:red", "el     : "+this.$el);   //[object HTMLDivElement]
        console.log(this.$el);
        console.log("%c%s", "color:red", "data   : "+this.$data); //[object Object]
        console.log("%c%s", "color:red", "message: "+this.message);   //今天周六了!!!
    },
    methods: {
        change(){
            this.message = "今天周二了!!!";
            console.group("==============点击事件执行的方法==============>>");
            console.log("%c%s", "color:red", "el     : "+this.$el);   //[object HTMLDivElement]
            console.log(this.$el);
            console.log("%c%s", "color:red", "data   : "+this.$data); //[object Object]
            console.log("%c%s", "color:red", "message: "+this.message);   //今天周六了!!!
        }
    }
})
</script>
</body>
</html>

函数执行顺序

1. 生命周期执行顺序

  • 页面初始化时:beforeCreate -> created -> beforeMount -> mounted
  • 页面发生修改时:beforeUpdate -> updated
  • 页面销毁时:beforeDestroy -> destroyed

2. 父子组件生命周期执行顺序

  • 页面初始化时:父beforeCreate -> 父created -> 父beforeMount ->子beforeCreate -> 子created -> 子beforeMount -> 子mounted-> 父mounted

从图中可以看到,子组件要先于父组件挂载完成。

  • 页面发生修改时:beforeUpdate -> updated 父、子组件间的更新互不影响,只更新自己。
  • 页面销毁时:父beforeDestroy -> 子beforeDestroy ->子destroyed->父 destroyed 销毁时也是子组件要先于父组件销毁

3. this.$nextTick在各生命周期的执行顺序

  • nextTick在各生命周期的执行顺序,nextTick是指在dom渲染完成后执行,结果如图。

  • 虽然每个周期使用$nextTick都可以获取到dom,但是还是建议在mounted中使用哈,因为beforeMount/mounted本来就是挂载dom滴

4. watch、computed、methods执行顺序

  • 页面初始化时: 会执行一次computed,watch初始化时不会执行,methods只有调用的时候才会执行。

  • 渲染完成后,触发methods: methods -> watch -> computed

总结

  • beforecreate:可以在这加个loading事件;
  • created :在这结束loading,还做一些初始化,实现函数自执行;
  • mounted : 在这发起后端请求,拿回数据,配合路由钩子做一些事情;
  • beforeDestory: 你确认删除vue实例了吗?
  • destoryed :当前实例已被销毁,解绑相关指令和事件监听器。

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

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

相关文章

无人机灯光含义的详解!!!

一、LED指示灯和状态指示灯 LED指示灯&#xff1a;通常位于飞行器的头部机臂上&#xff0c;用于显示无人机的当前状态。 状态指示灯&#xff1a;位于尾部机臂上&#xff0c;提供更多关于无人机状态的信息。 红绿黄灯交替闪烁 表示无人机正在进行系统自检。稍等片刻&#xf…

Mybatis获取主键自增的方法

原本的方法 使用原本的JDBC去获取主键自增的方法如下图所示&#xff1a; 在这段代码中&#xff0c;通过连接对象 conn 的 prepareStatement 方法创建了一个PreparedStatement对象&#xff0c;并将SQL语句和 RETURN_GENERATED_KEYS 常量作为参数传递给该方法。这意味着执行SQL…

使用 Python 创建 Windows 程序列表生成器:从安装程序到配置文件

在当今的数字时代&#xff0c;我们的计算机上安装了数不胜数的程序。但是&#xff0c;您是否曾想过如何快速获取所有已安装程序的列表&#xff0c;并将其转化为可用的配置文件&#xff1f;今天&#xff0c;我们将探讨如何使用 Python 创建一个强大的工具&#xff0c;它不仅可以…

StarRocks Lakehouse 快速入门——Apache Paimon

StarRocks Lakehouse 快速入门指南为您提供了湖仓技术概览&#xff0c;旨在帮助您迅速掌握其核心特性、独特优势和应用场景。本指南将指导您如何高效地利用 StarRocks 构建解决方案。文章末尾&#xff0c;我们集合了来自阿里云、饿了么、喜马拉雅和同程旅行等行业领导者在 Star…

【私有云场景案例分享①】高效的集群管理能力

一、前言 设备的管理对企业至关重要&#xff0c;会影响生产效率、成本控制和竞争力。然而&#xff0c;企业在设备管理上面临设备数量多、设备分布广、维护成本高等挑战。DeviceKeeper设备管理网站作为解决方案&#xff0c;可以通过远程设备监控、远程设备维护和包体共享等功能…

制造业MES系统源码,前端框架:vue.js,后端框架:springboot 功能模块包括:生产计划管理、物料管理、工艺管理、设备管理、

MES系统功能模块解析&#xff0c;MES系统源码 MES系统是一种用于协调和优化制造过程的信息管理系统&#xff0c;可以帮助企业实现生产计划的顺利执行&#xff0c;并提供全面的生产监控和数据分析功能。 MES系统常见的功能模块包括生产计划管理、物料管理、工艺管理、设备管理…

如何把Phalcon 集成到PhpStorm里面

一 背景 按照上一篇文章里面写的Phalcon 创建项目过程中的一些坑, 最终我们在终端可以基于Phalcon命令创建对应的开发项目。但在这个过程中,存在一个问题:那就是写代码的时候,发现Phalcon对应的依赖提示都没有,如下: 从上面这个截图来看,就能发现,Phalcon的啥…

音频剪辑在线工具哪个好?分享5款简单易上手的音频剪辑工具

暑期的泰山人山人海&#xff0c;游客们纷纷涌向这座名胜古迹。站在巍峨的泰山之巅&#xff0c;望着脚下绵延的群山和眼前无边的云海&#xff0c;人们不禁会想要记录下这一刻的声音。 但泰山的风声、游客的喧哗声、还有自然与人文的杂音交织在一起&#xff0c;要想将这声音中的…

【人工智能】 使用线性回归预测波士顿房价 paddlepaddle 框架 飞桨

一、简要介绍 经典的线性回归模型主要用来预测一些存在着线性关系的数据集。 回归模型可以理解为:存在一个点集,用一条曲线去拟合它分布的过程。如果拟合曲线是一条直线,则称为线性回归。 如果是一条二次曲线,则被称为二次回归。 线性回归是回归模型中最简单的一种。 本…

机房监控系统,全面监控机房动力环境实时报警@卓振思众

在现代企业运营中&#xff0c;机房作为计算机系统的核心支撑平台&#xff0c;承载着关键数据和应用的稳定运行。因此&#xff0c;保障机房环境的安全和设备的正常运行至关重要。【卓振思众】机房监控系统&#xff0c;作为一种先进的智能管理工具&#xff0c;正是为了实现这一目…

启发式算法之模拟退火算法

文章目录 1. 模拟退火算法概述1.1 算法起源与发展1.2 算法基本原理 2. 算法实现步骤2.1 初始化过程2.2 迭代与降温策略 3. 模拟退火算法的优化策略3.1 冷却进度表的设计3.2 参数调整与策略 4. 模拟退火算法的应用领域4.1 组合优化问题4.1.1 旅行商问题&#xff08;TSP&#xff…

Halcon阈值处理的几种分割方法

Halcon阈值处理的几种分割方法 文章目录 Halcon阈值处理的几种分割方法1. 全局阈值2. 基于直方图的自动阈值分割方法3. 自动全局阈值分割方法4. 局部阈值分割方法5. var_threshold算子6 . char_threshold 算子7. dual_threshold算子 在场景中选择物体或特征是图像测量或识别的重…

982200419控制燃烧器可面价

982200419控制燃烧器可面价 982200419控制燃烧器可面价 982200419控制燃烧器可面价 982200419控制燃烧器接线图 982200419控制燃烧器说明书 982200419控制燃烧器线路图 982200419燃烧机也叫燃烧器&#xff0c;按照燃料可分为燃油燃烧机和燃气燃烧机、生物质燃烧机&#x…

胡玫导演《红楼梦之金玉良缘》今日公映 李越版“琏二爷”实力不凡

今日&#xff0c;由胡玫执导&#xff0c;何燕江编剧&#xff0c;林鹏、卢燕、边程、张淼怡、李越等主演的电影《红楼梦之金玉良缘》全国公映。电影改编自曹雪芹不朽名著《红楼梦》&#xff0c;以“宝、黛、钗”三人的情缘纠葛入手&#xff0c;从“木石前盟”看“金玉良缘”&…

YOLOv8更换主干网络成MobileNetV3

目录 1. 添加主干网络模块 ​编辑1.1 在init.py中添加模块名 1.2 主体代码中添加调用语句块 2. 配置yaml文件 3. 修改成功 1. 添加主干网络模块 1.1 在init.py中添加模块名 1.2 主体代码中添加调用语句块 2. 配置yaml文件 3. 修改成功 自己随便找一个程序跑一跑验证…

Idea使用Maven下载源码

如题&#xff0c;Idea中使用Maven下载源码提示Cannot download sources for xxx。原因是在对应的镜像站没有找到源码包。笔者尝试下载spring-web-4.3.0.RELEASE的源码包时提示如此&#xff0c;原因是配置的阿里云镜像站没有上传对应的源码包&#xff0c;配置了华为镜像站后就可…

Linux(离线)内网部署 thingsboard-gateway 网关实战modbus通讯

前面我们讲解了在内网上如何部署Thingsboard&#xff0c;部署之后领导又要求部署上网关&#xff0c;然后通过modbus来监听设备&#xff0c;废话不多说&#xff0c;直接上干活。 第一步&#xff1a;下载thingsboard-gateway安装包 在Thingsboard官网中给了我们一个在线安装的地…

考勤系统微信小程序的设计与实现---附源码29756

目 录 1 绪论 1.1研究背景 1.2研究意义 1.3微信小程序的介绍 2考勤系统微信小程序系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系统用例分析 2.4本章小…

计算机的错误计算(六十)

摘要 用另一种方法计算计算机的错误计算&#xff08;五十五&#xff09;中案例&#xff1a;先使自变量与 取余&#xff0c;再计算取余后的余弦值&#xff0c;这时&#xff0c;得到了不同的输出。因此&#xff0c;即使不清楚正确结果&#xff0c;Python 与 Visual Studio 也各自…

TypeError when using openai-api

题意&#xff1a;使用 openai-api 时出现 TypeError&#xff08;类型错误&#xff09; 问题背景&#xff1a; Using the code below and openai version 0.28.0 i get an error which i cant resolve: 使用以下代码和 openai 版本 0.28.0 时&#xff0c;我遇到了一个无法解决…