这篇文章不是原创,看了其他人的分析贴,记录下自己学到的。本篇主要记录一下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生命周期及双向绑定相关推荐

  1. Vue学习 — 详解Vue生命周期

    目录 一.前言 二.生命周期 1.beforeCreat / created (1).beforeCreat: (2).created: 2.eforeMount / mounted (1).befo ...

  2. 一文带你吃透Vue生命周期(结合案例通俗易懂)

    文章目录 本篇学习目标 1. vue生命周期 1.0_人的-生命周期 1.1_钩子函数 1.2_初始化阶段 1.3_挂载阶段 1.4_更新阶段 1.5_销毁阶段 2. axios 2.0_axios基 ...

  3. 实例化vue发生了什么?(详解vue生命周期)

    实例化vue发生了什么?(详解vue生命周期) 本文将对vue的生命周期进行详细的讲解,让你了解一个vue实例的诞生都经历了什么~ 我在Github上建立了一个存放vue笔记的仓库,以后会陆续更新一些 ...

  4. Vue生命周期中钩子函数理解简记

    Vue生命周期钩子函数 钩子函数 beforeCreate created beforeMount mounted beforeUpdate updated beforeDestroy destroy ...

  5. 史上最全的Vue生命周期钩子函数11个

    什么是生命周期? 生命周期: Vue是一个构造函数,当执行执行这个函数时,相当于初始化vue实例: 在创建实例过程中,需要设置数据监听,编译模板,将实例挂载到DOM上,数据更新能够让DOM也更新,在这 ...

  6. 标注图+部分举例聊聊Vue生命周期

    "你不需要立马弄明白所有的东西,不过随着你的不断学习和使用,它的参考价值会越来越高." 现在项目中遇到了,好好回头总结一波Vue生命周期,以后用到的时候再来翻翻. 啥叫Vue生命周 ...

  7. 少侠请重新来过 - Vue学习笔记(二) - Vue生命周期

    Vue 生命周期和钩子 每一个vue实例创建时,会经历一段初始化的过程,同时会调用其生命周期钩子,实例的钩子this指向它的Vue实例,不需要在钩子用箭头函数. <template>< ...

  8. vue生命周期图示中英文版Vue实例生命周期钩子

    vue生命周期图示中英文版Vue实例生命周期钩子 知乎上近日有人发起了一个 "react 是不是比 vue 牛皮,为什么?" 的问题,Vue.js 作者尤雨溪12月4日正面回应了该 ...

  9. 详解vue生命周期及每个阶段适合进行的操作

    VUE生命周期的四个阶段 create 创建 -------- 创建vue实例并初始化 mount 挂载 -------- 把vue实例和视图进行关联 update 更新 ------- 监听数据与视 ...

最新文章

  1. ldap odbc mysql_Mysql+ODBC+OpenLDAP
  2. java二进制反转_Java实现 LeetCode 190 颠倒二进制位
  3. Java 7:在不丢失数据的情况下关闭NIO.2文件通道
  4. 【版本控制管理】 深入 001 A successful Git branching model GIT 项目分支策略和释放管理
  5. keras学习笔记-黑白照片自动着色的神经网络-Beta版
  6. JVM虚拟机-Class文件之访问标志
  7. linux centos erlang,CentOS 7.7安装Erlang和Elixir
  8. 老杜java_老杜最新Java零基础视频教程(适合Java 0基础,Java初学入门)
  9. matlab将函数展开成幂级数,解析函数展开成幂级数的方法分析.doc
  10. 【转】Steam 开发者收入计算
  11. 使用朴素贝叶斯进行个人信用风险评估
  12. 07_Numpy渐变图片的生成
  13. 红米5plus 刷twrp
  14. 塔菲尔曲线斜率的大小_电催化中Tafel斜率与决速步
  15. Python 超简单格式化代码,仅需一行命令
  16. 汉仪尚巍手书有版权吗_汉仪尚巍手书字体下载 汉仪尚巍手书体W字体免费版下载...
  17. 序列求和:问题描述 求1+2+3+...+n的值。 输入格式 输入包括一个整数n。 输出格式 输出一行,包括一个整数,表示1+2+3+...+n的值。
  18. 【视频汇聚】六安叶集中学智慧校园视频汇聚项目
  19. 二进制在线计算机,计算机进制转换计算
  20. Adobe Illustrator 2020 for Mac

热门文章

  1. nginx rewrite和根据url参数location
  2. DataList中的按钮触发事件的方法的实现
  3. 微软 Surface Pro、Studio、Laptop 全线更新
  4. ECMA Script 6新特性之解构赋值
  5. MongoDB学习(五)使用Java驱动程序3.3操作MongoDB快速入门
  6. 【工具使用系列】关于 MATLAB 液压元件,你需要知道的事
  7. 【干货分享】流程DEMO-外出申请
  8. 一次关于DNS服务器的故障排错记录——RNDC故障
  9. 密码学研究-玩转密钥
  10. 选择适合自己的那款操作系统