从源码角度了解Vue生命周期
每个Vue应用都是通过new Vue()创建一个Vue实例开始。Vue()函数可以传入选项Options,常见的有el、template和data选项等。
el 只在new创建实例时生效,其值可以是一个CSS选择器或一个HTML Element实例。实例挂载后(mounted之后)可通过vm.$el访问,如果开始实例化时不给el选项,则需要调用vm.$mount指定挂载点。挂载元素会被编译后生成的DOM替换掉。
template定义组件的模板,即要渲染的内容。
data选项的值是对象类型,它的property会被Vue实例所代理,成为响应式数据,拥有双向改变的特性。只有在创建时data中的属性property才会被响应式化。
Vue()的具体实现如下:
import {initMixin} from './init'
function Vue(options){
//安全性检查:是否为非生产环境且this是否是Vue的实例
//如果是非生产环境且this不是Vue的实例,即没有通过使用new实例化Vue
if(process.env.NODE_ENV!=='production'&&!(this instanceof Vue)){
warn('Vue is a constructor and should be called with the `new` keyword')
}
//
this._init(options)
}
initMixin(Vue)
export default Vue
_init方法是整个初始化流程的开始。initMixin方法向Vue构造函数的原型prototype挂载一些方法,_init便是其中之一。
export function initMixin(Vue){
//在Vue的构造函数的原型上添加一个_init方法
Vue.prototype._init=function(options){
//合并构造函数的选项和用户传入的选项并挂载到Vue实例vm的$options选项上
vm.$options=mergeOptions(
resolveConstructorOptions(vm.constructor),
options||{},
vm
)
//依次初始化
initLifecycle(vm) //初始化组件的生命周期
initEvents(vm) //初始化事件
initRender(vm) //初始化渲染函数
callHook(vm,'beforeCreate') //调用beforeCreate生命周期钩子函数
initInjections(vm) //初始化注入,处理inject选项
initState(vm) //初始化状态,包括data、props、methods、computed、watch
initProvide(vm) //初始化provide,处理provide选项
callHook(vm,'created') //调用created生命周期钩子函数
//如果有挂载的目标元素
if(vm.$options.el){
//挂载实例到目标元素上
vm.$mount(vm.$options.el)
}
}
}
每个Vue实例在创建时都要经过一系列过程:初始化、模板编译、挂载、卸载这四个阶段。阶段之间会陆续执行一类函数,称为生命周期函数。如下图所示:
Vue生命周期图

new Vue()到created的阶段是初始化阶段,该阶段会初始化属性props、事件events和响应式数据data,还有computed、watch、provide和inject。
created到beforeMount的阶段是模板编译阶段,明显运行时版本不包含该阶段,只存在于完整版Vue中。运行时版本的Vue.js需要搭配其他___工具如vue-loader等来预编译Vue模板。模板编译即通过编译器将模板代码转换成javascript代码。
beforeMount到mounted阶段是挂载阶段,挂载阶段也是Vue生命周期中占时最长的一个阶段。挂载的意思是指Vue.js将其实例挂载到DOM元素上,也就是用编译后的模板代码替换指定DOM元素的内部内容,实现模板内容的渲染。同时,Vue.js会启用Watcher来跟踪依赖的变化。依赖是指初始化时被响应式化的数据。挂载阶段的原理和vm.$mount方法息息相关。
在挂载阶段,数据(状态)发生变化后,Watcher会通知虚拟DOM重新渲染,新DOM将替换旧DOM,从beforeUpdate函数执行后到updated函数结束前是页面重渲染阶段。
最后的卸载阶段,Vue调用vm.$destroy方法来销毁自身。
从源码角度了解Vue生命周期的更多相关文章
- 一起学习vue源码 - Vue2.x的生命周期(初始化阶段)
作者:小土豆biubiubiu 博客园:https://www.cnblogs.com/HouJiao/ 掘金:https://juejin.im/user/58c61b4361ff4b005d9e8 ...
- Vue源码之组件化/生命周期(个人向)
大致流程 具体流程 组件化 (createComponent) 构造⼦类构造函数 const baseCtor = context.$options._base // plain options ob ...
- React源码剖析系列 - 生命周期的管理艺术
目前,前端领域中 React 势头正盛,很少能够深入剖析内部实现机制和原理.本系列文章希望通过剖析 React 源码,理解其内部的实现原理,知其然更要知其所以然. 对于 React,其组件生命周期(C ...
- React 源码剖析系列 - 生命周期的管理艺术
目前,前端领域中 React 势头正盛,很少能够深入剖析内部实现机制和原理. 本系列文章 希望通过剖析 React 源码,理解其内部的实现原理,知其然更要知其所以然. 对于 React,其组件生命周期 ...
- Spring5源码分析之Bean生命周期
Spring Bean生命周期的构成 Bean的完整生命周期经历了各种方法调用,这些方法可以划分为以下几类: Bean自身的方法: 这个包括了Bean本身调用的方法和通过配置文件中<bean&g ...
- 从BeanFactory源码看Bean的生命周期
下图是我搜索"Spring Bean生命周期"找到的图片,来自文章--Spring Bean的生命周期 下面,我们从AbstractAutowireCapableBeanFacto ...
- SuperSocket源码解析之会话生命周期
一 基本概念 会话(Session)是客户端与服务器进行通信的基本单元,也是一个Socket的封装,在http协议中也有Session机制,其主要作用封装一个通信单元socket,负责服务器与客户端消 ...
- 从template到DOM(Vue.js源码角度看内部运行机制)
写在前面 这篇文章算是对最近写的一系列Vue.js源码的文章(https://github.com/answershuto/learnVue)的总结吧,在阅读源码的过程中也确实受益匪浅,希望自己的这些 ...
- Vue源码学习1——Vue构造函数
Vue源码学习1--Vue构造函数 这是我第一次正式阅读大型框架源码,刚开始的时候完全不知道该如何入手.Vue源码clone下来之后这么多文件夹,Vue的这么多方法和概念都在哪,完全没有头绪.现在也只 ...
- Vuex 注入 Vue 生命周期的过程
首先我们结合 Vue 和 Vuex 的部分源码,来说明 Vuex 注入 Vue 生命周期的过程. 说到源码,其实没有想象的那么难.也和我们平时写业务代码差不多,都是方法的调用.但是源码的调用树会复杂很 ...
随机推荐
- 雪球 app 实战(1)
开头 因为理论篇结束之后,需要一个实战,估选用了雪球app作为一个作业 业务场景: 雪球 app 自选设置(入口位于 行情 模块) 作业内容 使用 百度脑图 编写 思维导图 [自选设置]模块的测试用例 ...
- 花式WA
如果WA了,请从下述所有方面全方面考察反思一下= =,(不断更新): 1.输出YES,NO不是N0,还有"."不要眼瞎= =,(只有空格回车不对才提示PE): 2.边界值,0,1, ...
- 2023-02-14:魔物了占领若干据点,这些据点被若干条道路相连接, roads[i] = [x, y] 表示编号 x、y 的两个据点通过一条道路连接。 现在勇者要将按照以下原则将这些据点逐一夺回:
2023-02-14:魔物了占领若干据点,这些据点被若干条道路相连接, roads[i] = [x, y] 表示编号 x.y 的两个据点通过一条道路连接. 现在勇者要将按照以下原则将这些据点逐一夺回: ...
- 2020-12-08:TIME_WAIT的等待时间为什么是2MSL?
福哥答案2020-12-08:[答案来自此链接:](http://bbs.xiangxueketang.cn/question/646)这里假设主动关闭方为A,被动关闭方为B,TIME_WAIT状态是 ...
- Windows server 2012 安装ad域
Windows server 2012 安装ad域 安装ad域(active directory)服务的作用:存储目录数据并管理域之间的通信,包括用户登录处理,身份验证和目录搜索等. 1.使用ad ...
- C# 版本特性一览
前言 使用 C# 作为开发语言已经 15 个年头了,受惠于 C# 的不断更新,伴随着大量的新特性与大量语法糖,让我更加容易写出简洁.高效的代码.日常中大量特性早已信手拈来,当然从未尝试过的特性更是难以 ...
- 【2023 · CANN训练营第一季】昇腾AI入门Pytorch
昇腾AI全栈架构 华为AI全栈全场景解决方案为4层,分别为芯片层.芯片使能层.AI框架层和应用使能层. 芯片 基于统一.可扩展架构的系列化AI IP和芯片,为上层加速提供硬件基础. 芯片产品:昇腾31 ...
- CANoe学习笔记(二):创建第一个事件触发帧(基于LIN)
内容: 创建一个事件触发帧: 包含几个不同无条件帧: 事件触发帧的触发: 事先准备: 创建三个文件夹,用来放不同类型文件: 工程创建 新建一个Lin工程,双击即可,然后命名为LINconf保存. 创建 ...
- 文字生成图像 AI免费工具第一弹 StableDiffusion
随着ChatGPT的爆火,text-to-image文字生成图像.以及更广义的AIGC(AI Generated Content)相关的话题最近一直热度不减.相信大家这几天经常会在各类的自媒体.甚至是 ...
- 抓包分析RST报文
大家好,我是蓝胖子,今天我们来分析下网络连接中经常出现的RST信号,连接中出现RST信号意味着这条链接将会断开,来看下什么时候会触发RST信号,这在分析连接断开的原因时十分有帮助. 本文的讲解视频已经 ...