Vue组件的生命周期

news2025/1/11 12:24:20

一、生命周期 & 生命周期函数

       1. 生命周期Life Cycle)是指一个组件从创建 -> 运行 -> 销毁的整个阶段,强调的是一个时间段

       2. 生命周期函数:是由 vue 框架提供的内置函数,会伴随着组件的生命周期,自动按次序执行,不需要用户显式地调用 —— 钩子函数

       注意: 生命周期强调的是时间段,生命周期函数强调的是时间点。

二、组件生命周期函数的分类

三、生命周期图示

 四、Vue2.0的生命周期函数

       组件的生命周期经历的阶段:

       1. 创建阶段:beforeCreate、created、beforeMount、mounted

       2. 运行阶段:beforeUpdate、updated

       3. 销毁阶段:beforeDestroydestroyed

       1. 创建阶段

     (1)beforeCreate

       创建阶段的第1个生命周期函数,组件的props,methods,data尚未被创建,处于不可用。

       在组件创建之前运行,此时Vue实例的el、data、data中的变量均为undefined

     (2)created(最早可以发起Ajax请求

       创建阶段的第2个生命周期函数,组件的props,methods,data已创建好,可以使用,但组件的模板结构尚未生成 ,不能操作DOM,但最早可以发起Ajax请求

       组件已经创建完成,data、props已经初始化了,el还是undefined(组件还没有挂载到DOM上)

       经常通过created函数调用methods中的方法,请求服务器的数据,并且把请求到的数据转存到data中,供template模板渲染时去使用

      (3)beforeMount

       创建阶段的第3个生命周期函数,内存编译好的HTML结构准备渲染到浏览器中,此时浏览器中还没有当前组件的DOM结构,无法操作DOM

       el被绑定(和DOM绑定),但未挂载

     (4)mounted(最早可以操作DOM)

       创建阶段的第4个生命周期函数,已经渲染内存的HTML结构到浏览器中,包含了当前组件的DOM结构,最早可以操作DOM

       组件挂载之后,el绑定、组件挂载

       2. 运行阶段(根据数据变化进入运行阶段)

       (1) beforeUpdate

       运行阶段的第1个生命周期函数,将要根据数据变化后、最新的数据,重新渲染组件的模板结构,此时数据变化后还未放到模板结构上

       当组件的内容被改变、隐藏的组件被显示、显示的组件被隐藏等触发

       (2)updated(当数据变化后,为了能够操作到最新的DOM结构)

       运行阶段的第2个生命周期函数,完成了最新数据重新渲染到组件的DOM结构

       当数据变化后,为了能够操作到最新的DOM结构,应将代码写在update中

       更新结束后触发

       3. 销毁阶段

       (1)beforeDestroy

       销毁阶段的第1个生命周期函数,组件还处于正常工作状态。

       在组件销毁之前。组件还是正常使用

     (2) destroyed

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

       组件销毁之后

​       4. keep-alive组件:是vue的内置组件,用来保持vue组件运行的某种状态,避免被重新渲染

        强调:组件(页面的组成部件)

​        第一步:创建组件(定义组件),组件文件的扩展名(后缀)可以是.vue,也可以是.js

        第二步:在使用组件的位置导入,注册组件

       ​ 第三步:使用组件:像html标签一样使用

五、示例

       我们创建了一个Vue根实例命名为app,将其挂载到页面id为app的dom元素上。

       局部注册的一个组件child并在根实例中将其注册使其可以在根实例的作用域中使用。

       将子组件用<keep-alive> 包裹,为接下来的测试作准备。

       keep-alive 是 Vue 内置的一个组件,可以使被包含的组件保留状态,或避免重新渲染。

       在vue项目中,难免会有列表页面或者搜索结果列表页面,点击某个结果之后,返回回来时,如果不对结果页面进行缓存,那么返回列表页面的时候会回到初始状态,但是我们想要的结果是返回时这个页面还是之前搜索的结果列表,这时候就需要用到vue的keep-alive技术了。”

    <script src="./js/vue.js"></script>

<body>
    <div id="app">
        <p>{{ message }}</p>
        <keep-alive>
            <my-components msg="hello" v-if="show"></my-components><!-- 子组件 -->
         </keep-alive>
    </div>

    <script>
        //1.定义子组件
        var child = {
            template:'<div>from child: {{msg}}</div>',//子组件的html模板内容
            props:['msg'],//接收父组件传递的msg
            data:function(){
                return {
                    childMsg:'child'
                }
            },
            deactivated:function(){//钩子函数:在组件非运行时触发
                console.log('component deactivated!');
            },
            activated:function(){//钩子函数:在组件运行时触发
                console.log('component activated!');
            }
        }

        //2.创建Vue实例:和DOM中的id为app的元素绑定
        const vm = new Vue({
            el:'#app',
            components:{//注册子组件
                'my-components':child
            },
            data(){
                return {
                    message:'father',
                    show:true
                }
            },
            // 3.定义生命周期函数
            beforeCreate:function(){
                console.group('beforeCreate 组件创建之前的状态---------------')
                let state = {
                    'el':this.$el,
                    'data':this.$data,
                    'message':this.message
                }
                console.log(state);
            },
            created:function(){
                console.group('created 组件创建完成的状态---------------');
                let state = {
                    'el':this.$el,
                    'data':this.$data,
                    'message':this.message
                }
                console.log(state); 
            },
            beforeMount:function(){
                console.group('beforeMount 组件挂载前的状态---------------');
                let state = {
                    'el':this.$el,
                    'data':this.$data,
                    'message':this.message
                }
                console.log(this.$el);
                console.log(state); 
            },
            mounted:function(){
                console.group('mounted 组件挂载结束的状态---------------');
                let state = {
                    'el':this.$el,
                    'data':this.$data,
                    'message':this.message
                }
                console.log(this.$el);
                console.log(state); 
            },
            beforeUpdate:function(){
                console.group('beforeUpdate 更新前的状态---------------');
                let state = {
                    'el':this.$el,
                    'data':this.$data,
                    'message':this.message
                }
                console.log(this.$el);
                console.log(state); 
                console.log('beforeUpdate == '+document.getElementsByTagName('p')[0].innerHTML);
            },
            updated:function(){
                console.group('updated 更新完成的状态---------------');
                let state = {
                    'el':this.$el,
                    'data':this.$data,
                    'message':this.message
                }
                console.log(this.$el);
                console.log(state); 
                console.log('updated == '+document.getElementsByTagName('p')[0].innerHTML);
            },
            beforeDestroy:function(){
                console.group('beforeDestroy 组件销毁前的状态---------------');
                let state = {
                    'el':this.$el,
                    'data':this.$data,
                    'message':this.message
                }
                console.log(this.$el);
                console.log(state); 
            },
            destroyed:function(){
                console.group('destroyed 组件销毁完成的状态---------------');
                let state = {
                    'el':this.$el,
                    'data':this.$data,
                    'message':this.message
                }
                console.log(this.$el);
                console.log(state); 
            }
        })
    </script>
</body>

       1. create 和 mounted 相关

       beforecreate:el 和 data 并未初始化 ;

       created:完成了 data 数据的初始化,el没有;

       beforeMount:完成了 el 和 data 初始化 ;

       mounted :完成挂载。(注意:在beforeMount阶段应用的 Virtual DOM(虚拟Dom)技术,先把坑占住了,到后面mounted挂载的时候再把值渲染进去。)

       2. activated 和 destroyed相关

       我们发现了activated周期钩子已经被触发,这是因为子组件my-components被<keep-alive> 包裹,随el的挂载触发。

       现在我们将此组件停用进行测试:由于子组件具有一个v-if指令v-if="show",因此我们可以通过将show的值置为false将其销毁。控制台输入 对象名.show = false;测试结果如下:

       由于在这里我们修改了data的值,所以会触发beforeUpdate和updated钩子,这里先不讨论这一组钩子,我们看到deactivated钩子已经触发,表示<keep-alive>已经停用,符合预期结果。

       现在我们对Vue实例进行销毁,调用app.$destroy()方法即可将其销毁,控制台测试如下:

       这里我们将data中的message属性改成了'message',发现dom并没有进行相应的响应,这证实了之前的说法。同样,如果你在子组件也加入destroyed钩子,发现该钩子也会被触发,这也证明了子实例也会被一起销毁。这里的销毁并不指代'抹去',而是表示'解绑'。

       3. updated相关

       beforeUpdate和updated是最后一对周期钩子了。

       我们发现beforeUpdate和updated触发时,el中的数据都已经渲染完成,但根据beforeUpdate == father而updated == message可知,只有updated钩子被调用时候,组件dom才被更新。

       在beforeUpdate可以监听到data的变化,但是view层没有被重新渲染,view层的数据没有变化。等到updated的时候,view层才被重新渲染,数据更新。

六、使用建议

      1. 在created钩子中可以对data数据进行操作,这个时候可以进行ajax请求将返回的数据赋给data

      2. 在mounted钩子对挂载的dom进行操作

     3. 在使用vue-router时有时需要使用<keep-alive></keep-alive>来缓存组件状态,这个时候created钩子就不会被重复调用了,如果我们的子组件需要在每次加载的时候进行某些操作,可以使用activated钩子触发。

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

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

相关文章

第四十三讲:神州防火墙混合模式的初始配置

混合模式即相当于防火墙既工作于路由模式&#xff0c;又工作于透明模式。在实际应用环境中&#xff0c;此类防火墙应用一般也比较广泛。混合模式分为两种&#xff1a; 一&#xff0c;ISP分配外网地址&#xff0c;内网为私网地址&#xff0c;服务器区域和内部地址为同一网段。这…

智慧商圈,对接微信、支付宝、云闪付实现自动积分

线下交易 商城下的门店使用本公司内部的pos机以及会员管理系统&#xff0c;通过pos收银时&#xff0c;根据管理系统配置的积分规则&#xff0c;可以自行给会员积分。但是当商城内部的部分门店不是使用内部的pos机进行收银时&#xff0c;则无法给给该批用户进行积分。以前有拍照…

吉他谱软件guitar pro2023吉他和弦、六线谱、BASS四线谱绘制

Guitar Pro由法国Arobas Music出品&#xff0c;主要用于管弦乐器的学习&#xff0c;通过建立不同的音轨&#xff0c;可完成不同乐器乐谱的编排制作。Guitar Pro发布23余年来&#xff0c;其强大的功能被广泛应用于专业乐队的创作和排练&#xff0c;其独创的gtp文档格式在专业领域…

「数据密集型系统搭建」原理篇|夯实基础,灵活设计

正所谓“完事开头难”&#xff0c;在设计技术方案时候&#xff0c;除了前期要做好背景调查、需求调研&#xff0c;开工动手的第一步就是做“数据建模”&#xff0c;也就是存储数据的结构设计&#xff0c;大部分时间是围绕关系型数据库进行的&#xff0c;少部分是在Redis上做K-V…

「技术直播」分布式数据库订阅功能的原理及实现

数据订阅是一种数据查询方式&#xff0c;其特点为&#xff1a;客户端执行一个查询语句后&#xff0c;可以增量形式&#xff0c;不断收到新到达服务端的、符合查询条件的数据。相比普通查询&#xff0c;订阅能够持续地、低延迟地将新写入的数据返回客户端。什么时候需要数据订阅…

40 行 Python 代码,写一个 CPU!

目录 一、引言 二、CPU 的组成 三、工作原理 四、CPU 指令工作详细剖析 五、 Python 实现 CPU 各组成部分 六、集成 CPU 七、为CPU编程&#xff0c;体会上古程序员 工作流程 八、总结 一、引言 CPU 如何工作&#xff1f;是困扰初级用户一个迷雾般的难题。我们可能知道诸…

HTML1

HTML是一门语言&#xff0c;所有的网页都是用HTML这门语言编写出来的 HTML(Hyper Text Markup Language)&#xff1a;超文本标记语言 超文本&#xff1a;超越文本的限制&#xff0c;除了文字信息&#xff0c;还可以定义图片、音频、视频等内容 标记语言&#xff1a;由标签构…

联合证券|北京宣布:全域禁放!新能源大爆发,有港股盘中暴涨超40%

周五A股商场和港股商场进一步走强&#xff0c;连续近期连续涨势&#xff0c;其间上证指数盘中再创近期反弹以来新高&#xff0c;新能源赛道股团体大涨&#xff0c;成为商场新的领涨主力。 北向资金也持续大举净买入&#xff0c;继昨天净买入超越百亿元之后&#xff0c;今天上午…

续集来了丨UI自动化测试(二):带视频,实在RPA高效进行web项目UI自动化测试

一、什么是web项目ui自动化测试&#xff1f; 通过测试工具模拟人为操控浏览器&#xff0c;使软件按照测试人员的预定计划自动执行测试的一种方式&#xff0c;可以完成许多手工测试无法完成或者不易实现的繁琐工作。 正确使用自动化测试&#xff0c;可以更全面的对软件进行测试…

让 APISpace 告诉你什么场景使用什么API(3)

Q&#xff1a;跨境电商平台&#xff0c;需要在界面上展示跨境包裹的物流信息&#xff0c;需要使用的是什么API&#xff1f; 需要 跨境国际快递物流查询API~ 跨境国际快递物流查询服务&#xff0c;支持900物流商&#xff0c;提供实时查询和单号订阅API接口。稳定高效&#xff…

160链表-相交链表

题目 链接&#xff1a;160. 相交链表 - 力扣&#xff08;LeetCode&#xff09; 思路 是指针相同&#xff0c;先求出两个链表的长度以及差值&#xff0c;让curA移动到和curB末尾对齐的位置&#xff0c;然后就可以遍历比较是否相同 代码&#xff1a; /*** Definition for sing…

【阶段二】Python数据分析数据可视化工具使用04篇:核密度估计图

本篇的思维导图: 核密度估计图 核密度估计图(kernel density plot)用于显示数据在X轴连续数据段内的分布状况。这种图表是直方图的变种,使用平滑曲线来绘制数值水平,从而得出更平滑的分布。核密度估计图比统计直方图优胜的一个地方,在于它们不受所使用分组数量的…

一文学会Linux IPC通信

目录 概览 单工、半双工、双工 各种IPC通信方式优缺点 1. 管道 2. 消息队列 3. 共享内存 4. 信号量 5. 信号 6. Socket套接字 精筛优秀博客 原本想详细写下&#xff0c;后发现有很多人总结过&#xff0c;那我就直接战在巨人的肩膀上不再重复造轮子了。 概览 单工、半…

PowerCLi 创建esxi登陆用户

官网PowerCLI参数配置参考 New-VMHostAccount 创建用户参考New-VIRole 创建权限组参考Get-VIPrivilege 查询所有角色层配置信息

由浅入深读透vue源码:diff算法

导语 | 开发者工作中&#xff0c;研究代码逻辑常需要思考这个问题&#xff1a;数组变更后&#xff0c;具体变更了哪一些元素&#xff1f;变更的位置如何&#xff1f;本文作者陈碧松解析并覆写了针对数组变化的diff算法逻辑。希望本文对你有帮助。diff方法的运行规则和前提方法为…

干货 | 医疗健康类APP违法违规个人信息收集的自动化检测技术研究

以下内容整理自清华大学《数智安全与标准化》课程大作业期末报告同学的汇报内容。第一部分&#xff1a;概述一、研究背景APP兴起在带给人们便利的同时&#xff0c;也在逐渐蚕食着人们的隐私边界。与此同时&#xff0c;“互联网医疗”使得医疗健康类APP兴起。二、研究目的本文旨…

Altium Designer 20 凡亿教育视频学习-05

第五部分学习 线距选择 焊盘与线之间的距离设置为为6mil 其他距离设置&#xff1a;如线与线之间的距离 Track--线的意思 copper--铜 via--过孔 SMD Pad--贴片焊盘 线宽选择 电源线需要加粗处理 操作1&#xff1a;专门为电源线制订规则 能专门为电源线制订宽度规则&…

基于STM32楼梯层控制系统

1、项目需求分析 项目目标意义&#xff1a; 随着社会的发展、 科技的进步以及人们生活水平的逐步提高&#xff0c; 各种方便于生活的遥控系统开始进入了人们的生活。 电梯的发展是由于需要从山坡上运输包括煤和材在内的原材料而引发的&#xff0c;而到了今日&#xff0c;电梯的…

JavaScript 注释

文章目录JavaScript 注释JavaScript 注释JavaScript 多行注释使用注释来阻止执行在行末使用注释JavaScript 注释 JavaScript 注释可用于提高代码的可读性。 JavaScript 注释 JavaScript 不会执行注释。 我们可以添加注释来对 JavaScript 进行解释&#xff0c;或者提高代码的可…

ArcGIS基础实验操作100例--实验59二维面转体模型

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 高级编辑篇--实验59 二维面转体模型 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff08;1&am…