vue生命周期及双向绑定
这篇文章不是原创,看了其他人的分析贴,记录下自己学到的。本篇主要记录一下vue内部流程,以及双向绑定原理。Vue的可爱之处在于他的双向绑定及Virtual DOM的思想。
vue内部流程
如图所示,实例化组件时,调用init方法,初始化事件,属性,data等。初始化data,是实现双向绑定的重要一步(后面再详细说)。挂载($mount)时,根据传入的模版解析编译成 render function。 再把render function 转成 Virtual DOM tree(虚拟DOM树)。数据更新时,Virtual DOM tree转成 真正的DOM之前,经历patch方法,计算那些更新的节点,更新相应的节点,生成DOM.每个步骤拆开的话如下:
init
组件实例化时,调用init(),初始化组件的生命周期相关属性,事件,props,data等等。vue双向绑定也在这个期间完成的(后面再细说)。
compile
组件$mount(挂载)时,根据传入的模版或者节点标识(id等)把组件模版编译(compile)成render function。 编译过程分三步:
- parse 解析模版中的指令,属性等数据,形成AST(抽象语法树),例如:
const element2 = {type: 1,tag: 'a',attrsList: [{name: ":href", value: "url"}, {name: "target", value: "_blank"}],attrsMap: {':href': 'url', 'target': '_blank'},parent: element1,children: []};
- optimize 标记静态节点,更新视图时,根据diff算法计算更新的节点时,直接跳过静态节点,提高diff算法性能。
- generate 把AST 转成render function.
render
render function 转成 VNode, 生成Virtual DOM tree(虚拟DOM树).VNode其实是一个描述DO节节点的javascript对象,抽象真正的DOM节点.为什么需要Virtual DOM ? 因为DOM操作总是很慢,操作数据对象不仅快,还有跨平台的能力。VNode比如:
{tag: 'div', children: [ tag: 'a', text: 'click me' }]
}
patch
数据更新时,patch方法是新的 Virtual DOM 树和旧 Virtual DOM 的diff算法,算出更新了哪些节点,更新对应的DOM节点。
双向绑定实现
vue的双向绑定是通过Object.definerProperty加发布订阅模式实现的。
object.defineProperty具体知识移步这里。重点是它的get和set方法,比如这个例子:
var obj = {};
var a;
Object.defineProperty(obj, 'a', {get: function() {console.log('get val'); return a;},set: function(newVal) {console.log('set val:' + newVal);a = newVal;}
});
obj.a; // get val
obj.a = '111'; // set val: 111
vue的双向绑定原理就是,比如data.number ='123';每个组件用到number属性的时候,都会调object.defineProperty()的get函数,从而收集到依赖number属性的vue组件。每个组件实例话时都有一个watcher,就是订阅者。我们叫收集依赖的对象为Dep。
看下Dep对象
//依赖收集对象
class Dep {constructor () {this.subs = [];}//收集依赖addSub (sub) {this.subs.push(sub);}//发布变化notify () {this.subs.forEach((sub) => {sub.update();})}
}
watcher对象
class Watcher {constructor () {Dep.target = this;}//更新视图update () {console.log("视图更新了哦");}
}
初始化过后,Dep对象收集到依赖number属性的订阅者watcher1,watcher2(用到number属性的组件vue1,vue2),当number属性变化时,调用set函数,我们调用依赖收集对象的(发布者)update方法去发布更新,每个watcher(订阅者)都收到更新提示,更新视图。就是这个样子啦~其实不难。
对于那些,show me the code 的同学:demo代码
参考:
掘金[vue内部运行机制][4],、
源码讲解[vue2.0远吗解读][5]
vue生命周期及双向绑定相关推荐
- Vue学习 — 详解Vue生命周期
目录 一.前言 二.生命周期 1.beforeCreat / created (1).beforeCreat: (2).created: 2.eforeMount / mounted (1).befo ...
- 一文带你吃透Vue生命周期(结合案例通俗易懂)
文章目录 本篇学习目标 1. vue生命周期 1.0_人的-生命周期 1.1_钩子函数 1.2_初始化阶段 1.3_挂载阶段 1.4_更新阶段 1.5_销毁阶段 2. axios 2.0_axios基 ...
- 实例化vue发生了什么?(详解vue生命周期)
实例化vue发生了什么?(详解vue生命周期) 本文将对vue的生命周期进行详细的讲解,让你了解一个vue实例的诞生都经历了什么~ 我在Github上建立了一个存放vue笔记的仓库,以后会陆续更新一些 ...
- Vue生命周期中钩子函数理解简记
Vue生命周期钩子函数 钩子函数 beforeCreate created beforeMount mounted beforeUpdate updated beforeDestroy destroy ...
- 史上最全的Vue生命周期钩子函数11个
什么是生命周期? 生命周期: Vue是一个构造函数,当执行执行这个函数时,相当于初始化vue实例: 在创建实例过程中,需要设置数据监听,编译模板,将实例挂载到DOM上,数据更新能够让DOM也更新,在这 ...
- 标注图+部分举例聊聊Vue生命周期
"你不需要立马弄明白所有的东西,不过随着你的不断学习和使用,它的参考价值会越来越高." 现在项目中遇到了,好好回头总结一波Vue生命周期,以后用到的时候再来翻翻. 啥叫Vue生命周 ...
- 少侠请重新来过 - Vue学习笔记(二) - Vue生命周期
Vue 生命周期和钩子 每一个vue实例创建时,会经历一段初始化的过程,同时会调用其生命周期钩子,实例的钩子this指向它的Vue实例,不需要在钩子用箭头函数. <template>< ...
- vue生命周期图示中英文版Vue实例生命周期钩子
vue生命周期图示中英文版Vue实例生命周期钩子 知乎上近日有人发起了一个 "react 是不是比 vue 牛皮,为什么?" 的问题,Vue.js 作者尤雨溪12月4日正面回应了该 ...
- 详解vue生命周期及每个阶段适合进行的操作
VUE生命周期的四个阶段 create 创建 -------- 创建vue实例并初始化 mount 挂载 -------- 把vue实例和视图进行关联 update 更新 ------- 监听数据与视 ...
最新文章
- ldap odbc mysql_Mysql+ODBC+OpenLDAP
- java二进制反转_Java实现 LeetCode 190 颠倒二进制位
- Java 7:在不丢失数据的情况下关闭NIO.2文件通道
- 【版本控制管理】 深入 001 A successful Git branching model GIT 项目分支策略和释放管理
- keras学习笔记-黑白照片自动着色的神经网络-Beta版
- JVM虚拟机-Class文件之访问标志
- linux centos erlang,CentOS 7.7安装Erlang和Elixir
- 老杜java_老杜最新Java零基础视频教程(适合Java 0基础,Java初学入门)
- matlab将函数展开成幂级数,解析函数展开成幂级数的方法分析.doc
- 【转】Steam 开发者收入计算
- 使用朴素贝叶斯进行个人信用风险评估
- 07_Numpy渐变图片的生成
- 红米5plus 刷twrp
- 塔菲尔曲线斜率的大小_电催化中Tafel斜率与决速步
- Python 超简单格式化代码,仅需一行命令
- 汉仪尚巍手书有版权吗_汉仪尚巍手书字体下载 汉仪尚巍手书体W字体免费版下载...
- 序列求和:问题描述 求1+2+3+...+n的值。 输入格式 输入包括一个整数n。 输出格式 输出一行,包括一个整数,表示1+2+3+...+n的值。
- 【视频汇聚】六安叶集中学智慧校园视频汇聚项目
- 二进制在线计算机,计算机进制转换计算
- Adobe Illustrator 2020 for Mac