Vue底层实现原理总结


Posted in Javascript onFebruary 17, 2018

前言

最近在研究 剖析Vue原理&实现双向绑定MVVM 这篇文章,一边学习一边总结一下自己的思考。

Vue是一个典型的MVVM框架,模型(Model)只是普通的JavaScript对象,修改它则视图(View)会自动更新。这种设计让状态管理变得非常简单而直观。那么Vue是如何把模型和视图建立起关联的呢?

实现原理概述

这是前言提到的文章里的代码,一段典型的体现了Vue特点的代码:

<div id="mvvm-app">
  <input type="text" v-model="word">
  <p>{{word}}</p>
  <button v-on:click="sayHi">change model</button> //点击这个button,word的值会发生改变
</div>

<script src="./js/observer.js"></script>
<script src="./js/watcher.js"></script>
<script src="./js/compile.js"></script>
<script src="./js/mvvm.js"></script>
<script>
  var vm = new MVVM({
    el: '#mvvm-app',
    data: {
      word: 'Hello World!'
    },
    methods: {
      sayHi: function() {
        this.word = 'Hi, everybody!';
      }
    }
  });
</script>

ue实现这种数据双向绑定的效果,需要三大模块:

Observer:能够对数据对象的所有属性进行监听,如有变动可拿到最新值并通知订阅者

Compile:对每个元素节点的指令进行扫描和解析,根据指令模板替换数据,以及绑定相应的更新函数

Watcher:作为连接Observer和Compile的桥梁,能够订阅并收到每个属性变动的通知,执行指令绑定的相应回调函数,从而更新视图

Observer

Observer的核心是通过Obeject.defineProperty()来监听数据的变动,这个函数内部可以定义setter和getter,每当数据发生变化,就会触发setter。这时候Observer就要通知订阅者,订阅者就是Watcher。

Watcher

Watcher订阅者作为Observer和Compile之间通信的桥梁,主要做的事情是:

  1. 在自身实例化时往属性订阅器(dep)里面添加自己
  2. 自身必须有一个update()方法
  3. 待属性变动dep.notice()通知时,能调用自身的update()方法,并触发Compile中绑定的回调

Compile

Compile主要做的事情是解析模板指令,将模板中的变量替换成数据,然后初始化渲染页面视图,并将每个指令对应的节点绑定更新函数,添加监听数据的订阅者,一旦数据有变动,收到通知,更新视图。

总结

以上就是本次整理关于Vue底层实现原理的全部知识内容,如果大家还有任何不明白的地方可以在下方的留言区讨论。

Javascript 相关文章推荐
javascript当中的代码嗅探扩展原生对象和原型(prototype)
Jan 11 Javascript
JavaScript实现点击自动选择TextArea文本的方法
Jul 02 Javascript
Windows下用PyCharm和Visual Studio开始Python编程
Oct 26 Javascript
AngularJS基础 ng-model 指令详解及示例代码
Aug 02 Javascript
jQuery时间日期三级联动(推荐)
Nov 27 Javascript
JavaScript数组复制详解
Feb 02 Javascript
Bootstrap实现的经典栅格布局效果实例【附demo源码】
Mar 30 Javascript
jQuery实现web页面樱花坠落的特效
Jun 01 jQuery
基于Vue.js实现tab滑块效果
Jul 23 Javascript
微信小程序 POST请求的实例详解
Sep 29 Javascript
JS/HTML5游戏常用算法之路径搜索算法 A*寻路算法完整实例
Dec 14 Javascript
jQuery实现电梯导航模块
Dec 22 jQuery
js实现控制文件拖拽并获取拖拽内容功能
Feb 17 #Javascript
图文介绍Vue父组件向子组件传值
Feb 17 #Javascript
JavaScript异步加载问题总结
Feb 17 #Javascript
js装饰设计模式学习心得
Feb 17 #Javascript
Vue组件库发布到npm详解
Feb 17 #Javascript
JS声明对象时属性名加引号与不加引号的问题及解决方法
Feb 16 #Javascript
JavaScript中严格判断NaN的方法
Feb 16 #Javascript
You might like
php数组函数序列之array_values() 获取数组元素值的函数与方法
2011/10/30 PHP
php简单浏览目录内容的实现代码
2013/06/07 PHP
PHP PDOStatement::rowCount讲解
2019/02/01 PHP
ext for eclipse插件安装方法
2008/04/27 Javascript
验证手机号码的JS方法分享
2013/09/10 Javascript
setTimeout和setInterval的深入理解
2013/11/08 Javascript
简单选项卡 js和jquery制作方法分享
2014/02/26 Javascript
JavaScript中的style.cssText使用教程
2014/11/06 Javascript
js实现tab选项卡切换功能
2017/01/13 Javascript
AngularJS $http模块POST请求实现
2017/04/08 Javascript
浅谈angular.copy() 深拷贝
2017/09/14 Javascript
Vue+Jwt+SpringBoot+Ldap完成登录认证的示例代码
2018/05/21 Javascript
angularjs实现table表格td单元格单击变输入框/可编辑状态示例
2019/02/21 Javascript
Vue基于vuex、axios拦截器实现loading效果及axios的安装配置
2019/04/26 Javascript
使用jQuery实现掷骰子游戏
2019/10/24 jQuery
[56:47]Ti4 循环赛第三日 iG vs Liquid
2014/07/12 DOTA
Python获取文件ssdeep值的方法
2014/10/05 Python
Python获取SQLite查询结果表列名的方法
2017/06/21 Python
python实现机械分词之逆向最大匹配算法代码示例
2017/12/13 Python
Python3 中文文件读写方法
2018/01/23 Python
python 在某.py文件中调用其他.py内的函数的方法
2019/06/25 Python
PyCharm中关于安装第三方包的三个建议
2020/09/17 Python
详解如何用HTML5 Canvas API控制图片的缩放变换
2016/03/22 HTML / CSS
化石印度尼西亚在线商店:Fossil Indonesia
2019/03/11 全球购物
雅虎笔试题(字符串操作)
2015/03/24 面试题
高中生的学习总结自我鉴定
2013/10/26 职场文书
自我评价的写作规则
2014/01/06 职场文书
迟到检讨书1000字
2014/01/15 职场文书
打架检讨书300字
2014/02/02 职场文书
简单租房协议书范本
2014/08/20 职场文书
房屋过户委托书范本
2014/10/07 职场文书
小学班主任经验交流材料
2014/12/16 职场文书
预备党员转正党小组意见
2015/06/01 职场文书
详解Django中 render() 函数的使用方法
2021/04/22 Python
撤回我也能看到!教你用Python制作微信防撤回脚本
2021/06/11 Python
vue项目配置sass及引入外部scss文件
2022/04/14 Vue.js