详细一些的vue生命周期
如果你和我一样,以前对vue生命周期的理解仅限于生命周期钩子,那么本文可以让我们更深入一层,理解vue在生命周期各个阶段所做的事,对我们对vue的理解和使用很有好处。
(1)通过new Vue()创建新的vue实例
不管页面还是组件,都是一个个vue实例。一个vue应用,其实就是一个个vue实例的嵌套。
(2)初始化生命周期和事件监听
vue实例在生命周期中,会用一些内部变量来标志生命周期的当前阶段,比如_isMounted、_isDestroyed等,这些标志对于vue的内部运行很重要,决定了在什么时候做什么事。
vue会绑定事件监听函数,包括组件自身的事件监听,和父组件向子组件传递的事件监听。
(3)beforeCreate钩子
此时还无法访问props、data、computed、watch、methods。
(4)初始化状态
初始化props、data、computed、watch、methods,vue会在此时循环遍历props、data、computed的每一个属性,用Object.defineProperty()把属性转换为getter、setter,这是vue2实现响应式的基础。
(5)created钩子
此时props、data、computed、watch、methods已经初始化完成,可以通过this来调用了。如果想在进入页面后马上做一些操作,此时是最好的选择,我们一般都在此时调用api拉取数据。
(6)开始挂载
如果el属性存在,则执行$mount()开始挂载。否则,等到vm.$mount()被调用时,再开始挂载。
(7)beforeMount钩子
this.$el开始可以访问,不过此时获取到的是vue实例挂载前的DOM对象。
(8)模板编译
检查el、templete、render三个属性,如果render存在,则直接作为render函数进入下一步,否则如果templete存在,则把它编译成render函数,否则如果el存在,则以el的outerHTML作为模板编译成render函数。总之,这一步的目的就是得到一个render函数,也就是渲染函数。每一个vue组件都有自己的render函数。
(9)生成虚拟DOM
执行render函数,得到虚拟DOM。
(10)渲染
用vue实例的数据填充虚拟DOM,把虚拟DOM(是一个对象)渲染为真实的DOM(就是网页中的DOM元素)。
(11)挂载
把真实的DOM挂载到页面中。
如果有el属性,则替换掉el的outerHTML。如果没有,则会等到$mount()被调用时再挂载(参数可以是css选择器或者DOM对象),同样替换掉目标元素的outerHTML,不管它里面有什么内容。如果没有调用$mount(),则DOM对象会保持在内存中,你可以通过this.$el获取到它,然后手动插入到页面中。
(12)mounted钩子
此时DOM已经正式挂载到页面中,可以通过this.$el访问到最终的DOM对象。需要访问DOM的操作可以在此时进行,常见于一些第三方库。
(13)beforeUpdate钩子
当模板的依赖数据发生变化时,beforeUpdate钩子会被触发,模板开始重更新渲染。
(14)diffing
生成新的虚拟DOM,和旧的虚拟DOM进行差异化比较,这个过程叫“diffing”。
(15)patching
基于上一步的结果,尽可能少的对真实DOM做出修改,这个过程叫“patching”。
(16)updated钩子
在DOM更新完成后,updated钩子被触发,此时,你可以访问到更新后的DOM。
我们更常用的是在代码中,修改data数据后想要马上访问到更新后的DOM,此时可以把代码写在this.$nextTick()的参数函数里。
(17)beforeDestroy钩子
vue实例即将被销毁,但此时实例仍然完全可用。
我们一般在此时做一些清理工作,比如:移除全局的事件监听(比如window的resize事件)、清理setTimeout和setInterval、释放一些资源(比如websocket连接)、保存组件的状态(比如滚动的位置、复杂的表单输入)。
(18)destroyed钩子
vue实例已经被销毁,所有的事件监听已经被移除,所有的子实例也已经被销毁。
如果该实例有子组件,子组件的从beforeCreate到mounted将会插入到该实例的beforeMount和mounted之间进行,子组件的beforeDestroy和destroyed则会插入到该实例的beforeDestroy和destroyed之间进行。至于beforeUpdate和updated,vue组件的更新基于依赖追踪,父组件和子组件的更新没有必然的联系。可以看一下我的上一篇文章:《vue的响应式原理:依赖追踪》。
有子组件的实例生命周期如下:
(1)beforeCreate
(2)created
(3)beforeMount
(4)子组件beforeCreate
(5)子组件created
(6)子组件beforeMount
(7)子组件mounted
(8)mounted
(9)beforeDestroy
(10)子组件beforeDestroy
(11)子组件destroyed
(12)destroyed
这样的设计,保证了父组件挂载完成时,子组件已全部挂载,父组件销毁时,子组件已全部销毁,确保了它们之间逻辑上的所属关系。
本人水平非常有限,写作主要是为了把自己学过的东西捋清楚。如有错误,还请指正,感激不尽。
详细一些的vue生命周期的更多相关文章
- Vue学习之--------Vue生命周期beforeCreate、created、beforeMount、mounted、beforeDestroy 。。。(图解详细过程)(2022/7/17)
文章目录 1.Vue生命周期 1.1 概念 1.2 图解 2.钩子函数的用法说明 2.1 beforeCreate()和created()的详细讲述 2.1.1 方法说明 2.1.2 代码实例 2.1 ...
- 【Vue笔记】-- 详解vue生命周期
针对于Vue的生命周期进行详细的说明,方面加深对各个方法的引用. 引言: 前几天重新回顾vue官网时,看到vue的生命周期,想着自己用vue开发了快一年了,就总结总结vue知识,再次加深自己对vue的 ...
- vue 生命周期钩子
每个vue实例被创建时都会经历一系列初始化的过程,像是一个生命从无到有的过程,所以叫生命周期,而这个过程都有对应的不同阶段,也就对应了生命周期不同的钩子函数,这些生命周期函数,作为vue实例的属性使用 ...
- vue 生命周期的详解
一.vue生命周期的解析 > 1>什么是vue生命周期 每个vue实例在被创建之前都要经过一系列的初始化过程,这个过程就是vue的生命周期.详细来说,就是Vue实例从开始创建,初始化数据, ...
- 简单记录一下vue生命周期及 父组件和子组件生命周期钩子执行顺序
首先,vue生命周期可以用下图来简单理解 当然这也是官方文档的图片,详细的vue周期详解请参考这里 然而当同时存在父子组件的时候生命周期钩子是如何执行的呢? 请看下文: 加载渲染过程父beforeCr ...
- Vue生命周期,我奶奶看了都懂了
最近一直在学习Vue,而vue生命周期是我们不可能绕开的一个很核心的知识点,今天来简单的梳理一下大概的内容. 一.钩子函数 在一开始学习的时候,总有钩子函数这个名词冒出来,而且在vue官网文档中也频繁 ...
- vue生命周期的介绍
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- vue 生命周期
一 vue的生命周期如下图所示(很清晰) 二 vue生命周期的栗子 注意触发vue的created事件以后,this便指向vue实例,这点很重要 <!DOCTYPE html> <h ...
- 详解vue生命周期
vue生命周期 @(vue)[生命周期] 前言 在使用vue一个多礼拜后,感觉现在还停留在初级阶段,虽然知道怎么和后端做数据交互,但是对于mounted这个挂载还不是很清楚的.放大之,对vue的生命周 ...
- 关于vue生命周期
官网给出的实例的生命周期图如下: beforeCreate(页面创建前),created(页面创建后),beforeMount(页面载入前),mounted(页面载入后),beforeUpdate(页 ...
随机推荐
- nflsoj 5926 素数环
题目非常简单,只需要判断相邻两个数的和是不是素数,素数的判断参考数论 不过要注意的一点是题目说的是一个环,所以首尾两个数的和也要是素数 我在输出的时候加上了 is_prime(path[n-1]+1) ...
- 知识图谱(Knowledge Graph)- Neo4j 5.10.0 Desktop & GraphXR 连接自建数据库
#输入查看数据库连接 neo4j$ :server status 添加 远程连接,输入连接地址 Graph Apps 选择 GraphXR 打开 显示
- 4、Mybatis核心配置文件详解
4.1.environments <!-- environments标签:配置多个连接数据库的环境 default属性:设置默认使用的环境的id --> <environments ...
- 三维模型OSGB格式轻量化的跨平台兼容性技术分析
三维模型OSGB格式轻量化的跨平台兼容性技术分析 在三维模型应用中,OSGB格式轻量化处理是一种常见的技术手段,可以通过数据压缩.简化.滤波等操作,降低三维模型数据的存储空间和传输带宽需求,提高应用程 ...
- 如何修改min.js或者压缩后的js,以便提高代码的可读性。
前端的js上线的时候一般会使用打包工具处理(webpack,gulp,ugly.js 等).这样做有几点作用. 可以压缩空间,提高页面响应速度 一定程度上可以保护自己的代码安全,防止别人清晰看懂逻辑或 ...
- Badusb制作,远程别人电脑
Badusb制作 插一下U盘黑一台电脑,插了我的U盘你可就是我的脑了,(▽) 理论准备 我们要用它就应该知道他的工作原理是怎么样的,方便我们去发散思维去使用它. Badusb的原理是利用HID(Hum ...
- Ubuntu Linux 更换国内源
Ubuntu的官方源对于国内用户来说是比较慢的,可以将它的源换成国内的源,用起来就快很多了. # Ubuntu server 环境 ubuntu@ubuntu:~$ sudo su - [ sudo ...
- Adobe全家桶PS、PR、AU等2022正版永久有效,无需破解直接安装就能用
[Adobe全家桶]已经亲测绝对好用,下载地址: 关注我的wx公众号"奋斗在IT"回复1013获取下载地址.
- Abp vNext 模块加载机制
文章目录 生命周期 PreConfigureServices 添加依赖注入或者其它配置之前 ConfigureServices 添加依赖注入或者其它配置 PostConfigureServices 添 ...
- javascript继承的 6 种方法
1. 原型链继承 2. 借用构造函数继承 3. 组合继承(原型+借用构造) 4. 原型式继承 5. 寄生式继承 6. 寄生组合式继承