vue学习指南:第三篇(详细) - vue的生命周期
今天小编给大家详细讲解一下 vue 的生命周期。希望大家多多指教,哪里有遗漏的地方,也请大家指点出来 谢谢。
一、 怎么理解 Vue 的生命周期的?
生命周期:从无到有,到到无的一个过程。Vue的生命周期对组件来说的 或 实例来说。
简单理解:比如我们都知道 js 中的定时器,定时器都有开始的那一秒,已经执行过程中,最后执行完毕,我们的 Vue 的生命周期就好像 定时器一样,有许多过程,他们就像钩子一样,相互牵连着。
1. 在Vue当中 组件(自定义的一些标签) 浏览器是无法解析的。
2. 那组件的自定义标签怎么使用的呢?
主要分一下几个过程:
从创建它 》到使用它》到使用完毕》在销毁它
3. vue实例对象是最大的组件(也可以称它为根组件)
什么是钩子函数?
因为 Vue 的生命周期都是分 一个阶段一个阶段的 并且都是相连的。
二、Vue的生命周期 主要分 四个阶段 和 八个过程
我们先说 哪四个阶段:
Create 创建
Mount 挂载(加载)
Update 更新
Destroy 销毁
又是哪八个过程呢:
Create之前和Create之后
Mount之前和Mount之后
Update之前和Update之后
Destroy之前和Destroy之后
debugger 断点调试 在工作当中会经常用得到的
Vue的生命周期都写在 Vue实例下
1. 第一个过程 beforeCreate
beforeCreate 实例初始化之前。数据没有加载(data),页面更没显示。
第一步初始化之前数据(data)还没有拿到呢,data还没有存在就会执行它。
// 这是个函数,初始化之前
beforeCreate(){
console.log(this.a) // 会打印 undefined 为什么是undefined?说明我在执行这个函数,没数据
debugger
}
数据还没有加载过来,往往在这个阶段做 loading 请求数据 请求状态,因为什么都没有
2. 第二个过程 created
1. Created 实例初始化之后。它仅仅只请求到了数据,事件,属性等。但是没有加载,页面依然没有显示。
在这个阶段 往往发送数据(ajax)请求,http请求
created(){
console.log(this.a)//能请求到数据,但页面不显示
debugger
}
2. 在created之后这个 $el 属性还是不可见的,它会在created和beforeMount判断一下有没有$el这个选项。
3. Create到beforeMount 有个判断:
1. Create到beforeMount主要是找模板,模板都是虚拟的
2. Create -之间的过程> beforeMount之间 vue会在options 中查找有没有 el 选项,有就把他作为模板,没有通过 vm.$mount() 这个方法去挂载。
说白了你指定模板可以通过 el:”#app”指定,也可以通过vm.$mount()去指定
}).$mount("#app") el:"#app",
3. 有el就继续判断,你有没有template属性,如果还要模板选项(属性),那就直接把模板渲染出去,没有就把el的东西渲染出去扔掉#app body里面。
4. 如果有模板就渲染模板的东西可以看的完全没有el了
5. Created之后数据请求过来了,就是找对应的模板
3. 第三个过程 beforeMount
beforeMount vue会将 el对应的模板加到 vm.$el 中去,但是还没有挂载出去,页面还没有显示。
现在有个问题?视图没渲染为啥页面会有{{a}},button?
首先视图没有出来不是说页面没有出来,浏览器在加载页面是从上到下,从上到下加载过程中,是先执行body,还是script?先执行body,body该解析的解析,像html标签能识别(有解析标签的功能),而{{a}},它给当作内容渲染了,load不识别,不识别就不管了,然后你在创建实例的时候,又把里面的东西当作模板重新再次渲染。
什么是视图:
是模板里面的东西,现在还没有加载就不是模板。什么时候是模板?created或beforeMount
在beforeMount的时候我们可以找到模板了,只是还没有加载
beforeMount(){
console.log(this.$el)
debugger;
},
4. 第四个过程 mounted
mounted 页面加载出来了,所有的节点都出来了
mounted(){
console.log(this.$el)
debugger;
},
5. 第五个过程 beforeUpdated 更新也分两个 更新前 和 更新后
beforeUpdated 数据更新前
beforeUpdate(){
console.log("数据准备更新")
debugger;
},
在虚拟 dom 中使用 differ算法,在内存中实现,Mounted之前过程就不管了,更新就加载,加载过程中不是全部都加载,如果是全部加载又要回到出发点,哪里更新了我在虚拟dom进行对比下,对比完重新在去挂载,谁变了谁去挂载,谁去更新,之前的整个dom树不会跟着你一起更新,如果跟着你更新又会回到起点(beforeCreate),muntud之前都不管了。如果想看属性的变化可以使用 watch(属性监听)这个方法。
6. 第六个过程 Updated
Updated 更新完
更新完,在渲染,谁改变了渲染谁。不是整个dom树重新渲染
7. 第七个过程 销毁也分两个,销毁前和销毁后
销毁前 before Destory
销毁后 destroy
实例销毁需要人为触发
注意:这个地方问题很多尤其是组件拼接,组件里面套组件的时候
销毁:之前渲染好的保持不变 保留下来,后面再使用这个实例就不起作用了。
怎么销毁?
通过 vm.$destory()
三、组件的生命周期:
实例里面套组件
组件也有生命周期
嵌套组件生命周期的执行顺序:
先执行实例的vm.beforecreate -> 依然是vm.created -> 下一个还是vm.beforeMount ->这一块主要找el模板 模板里有组件,有组件开始走子组件里面的了是son.beforecreate。后期调数据的时候哪里该调哪里不该调,跟顺序有很大关系,如果调错了数据不会被更改的。
先执行实例的vm.beforecreate -> vm.created ->vm.beforeMount -> son.beforecreate -> son.created ->son.beforeMount ->继续执行 son.mountnd -> vm.mounted(又回到父级身上)
注意:正常加载是这样的:
先执行实例的vm.beforecreate -> vm.created ->vm.beforeMount ->先执行到父组件的beforeMount准备加载,再去找模板,发现模板里面有子组件然后对子组件进行渲染。son.beforecreate -> son.created ->son.beforeMount ->继续执行 son.mountnd ->,加载完之后再去加载父组件。
以上三个顺序是一样的,我给细节化,方便大家理解
注意:
1. 组件嵌套的时候数据怎么改都改不了,说明根生命周期顺序有关。
2. 请求的数据在子组件是a,但是在父组件还是原来的,所以给生命周期顺序有关。
更改组件类的数据 修改子组件的数据顺序:
先执行实例的vm.beforecreate -> vm.created ->vm.beforeMount -> son.beforecreate -> son.created ->son.beforeMount ->继续执行 son.mountnd -> vm.mounted(又回到父级身上) -> son.beforeUpdate -> son.updated
组件更新数据,只会调用自己的 beforeupdate和updated ,不会影响到其它组件的更新钩子。如果说父组件获取子组件中的标签中的内容(这个内容会被子组件修改),父组件获取的都是修改前的内容,因为子组件的更新,不会再去触发父组件的 mounted,this. $nexTick() 它是组件中(包括子组件)所有的钩子执行完毕之后才会触发。
作者:晋飞翔
手机号(微信同步):17812718961
希望本篇文章 能给正在学习 前端的朋友 或 以及工作的朋友 带来收获 不喜勿喷 如有建议 多多提议 谢谢!!!
vue学习指南:第三篇(详细) - vue的生命周期的更多相关文章
- vue学习指南:第二篇(详细Vue基础) - Vue的指令
一. Vue 的介绍 1. vue是一个 mvvm 的框架.(面试官经常会问的),angular 是 mvc的框架. 2. vm 是 vum 的实例,这个实例存在计算机内存中,主要干两件大事: 1. ...
- vue学习指南:第九篇(详细) - Vue的 Slot-插槽
Slot v-slot 插槽元素 浏览器在解析时候首先把它当作标签来解析,只有遇到不认识的就不管了,直接跳过,当你发现是组件,在以组件形式解析. 使用插槽的好处? 比如一个网站 分布顶部都是一样的, ...
- vue学习指南:第一篇 - vue的介绍
三大主流框架: 1. Vue.js 是目前最火的一个前端框架,react是最流行的前端框架 (react除了开发网站,还可以开发手机app,Vue语法也是可以用于手机App开发的,需要借助于wexx) ...
- vue学习【第三篇】:vue之node.js的简单介绍
什么是node.js 它是可以运行JavaScript的服务平台,可以吧它当做一门后端程序,只是它的开发语言是JavaScript 安装node.js node.js的特性 - 非阻塞IO模型 - 时 ...
- SQL学习指南第三篇
再谈连接 外连接 之前的范例都是没有考虑条件可能无法为表中的所有行匹配的问题 左外连接与右外连接 SELECT a.account_id, a.cust_id, b.name FROM account ...
- Java框架spring 学习笔记(三):Bean 的生命周期
当一个 bean 被实例化时,它可能需要执行一些初始化使它转换成可用状态.当bean不再需要,并且从容器中移除时,需要做一些清除工作.为了定义安装和拆卸一个 bean,我们只要声明init-metho ...
- Java工程师学习指南(中级篇)
Java工程师学习指南 中级篇 最近有很多小伙伴来问我,Java小白如何入门,如何安排学习路线,每一步应该怎么走比较好.原本我以为之前的几篇文章已经可以解决大家的问题了,其实不然,因为我写的文章都是站 ...
- RabbitMQ学习总结 第三篇:工作队列Work Queue
目录 RabbitMQ学习总结 第一篇:理论篇 RabbitMQ学习总结 第二篇:快速入门HelloWorld RabbitMQ学习总结 第三篇:工作队列Work Queue RabbitMQ学习总结 ...
- 学习KnockOut第三篇之List
学习KnockOut第三篇之List 欲看此篇---------------------------------------------可先看上篇. 第一步,先搭建一个大概的框架起来 ...
随机推荐
- [20190910]索引分支块中TERM使用什么字符表示.txt
[20190910]索引分支块中TERM使用什么字符表示.txt --//做索引块转储,一些root,分支节点出现TERM,从来没有关注使用字符表示,简单探究看看. 1.环境:SCOTT@test01 ...
- Linux—服务器SSL/TLS快速检测工具(TLSSLed)
一.下载TLSSLed [root@localhost ~]# yum install tlssled 二.服务器SSL/TLS快速检测工具TLSSLed 现在SSL和TLS被广泛应用服务器的数据加密 ...
- (五)Amazon Lightsail 部署LAMP应用程序之迁移到Amazon RDS实例
迁移到您的Amazon RDS实例 在某些时候,您的应用程序需求可能需要在 Amazon Lightsail中找不到的功能.幸运的是,将应用程序的一个或所有部分移动到其他AWS服务中非常简单 您将数据 ...
- Redis缓存策略
常用策略有“求留余数法”和“一致性HASH算法” redis存储的是key,value键值对 一.求留余数法 使用HASH表数据长度对HASHCODE求余数,余数作为索引,使用该余数,直接设置或访问缓 ...
- 浅谈DFS序
浅谈DFS序 本篇随笔简要讲解一下信息学奥林匹克竞赛中有关树的DFS序的相关内容. DFS序的概念 先来上张图: 树的DFS序,简单来讲就是对树从根开始进行深搜,按搜到的时间顺序把所有节点打上时间戳. ...
- CF-378 B.Semifinals
题目意思:有n个参赛者,他们都需要参加两场半决赛.第一场半决赛的成绩依次是a1, a2, ..., an,分别对应第1-第n个人的成绩.第二场则是b1, b2, ..., bn.其中这两个序列都是以递 ...
- 【CometOJ】Comet OJ - Contest #8 解题报告
点此进入比赛 \(A\):杀手皇后(点此看题面) 大致题意: 求字典序最小的字符串. 一场比赛总有送分题... #include<bits/stdc++.h> #define Tp tem ...
- AChartEngine折线图实例
最近做项目要用到图表,在网上找相关的解决方案找了很久,搜到最多的就是这个框架,所以就开始研究下怎么使用,首先研究的就是折线图,如是做了一个实例. AChartEngine下载地址:http://cod ...
- vue使用--saas的引入与使用
什么是saas.scss? saas是一种动态样式语言,属于CSS预处理器,为CSS增加了一些编程特性,比如变量.嵌套.函数.继承.运算等等.开发人员可以像使用js等语言一样使用saas进行css的 ...
- 探索 ASP.Net Core 3.0系列三:ASP.Net Core 3.0中的Service provider validation
前言:在本文中,我将描述ASP.NET Core 3.0中新的“validate on build”功能. 这可以用来检测您的DI service provider是否配置错误. 具体而言,该功能可检 ...