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 var声明变量背后的原理示例解析
Oct 12 Javascript
基于jquery实现的文字向上跑动类似跑马灯的效果
Jun 17 Javascript
jQuery仿360导航页图标拖动排序效果代码分享
Aug 24 Javascript
javascript实现动态标签云
Oct 16 Javascript
基于Bootstrap实现图片轮播效果
May 22 Javascript
微信小程序 label 组件详解及简单实例
Jan 10 Javascript
详解AngularJs路由之Ui-router-resolve(预加载)
Jun 13 Javascript
vue设计一个倒计时秒杀的组件详解
Apr 06 Javascript
jQuery实现数字华容道小游戏(实例代码)
Jan 16 jQuery
node.js实现http服务器与浏览器之间的内容缓存操作示例
Feb 11 Javascript
TypeScript 运行时类型检查补充工具
Sep 28 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
NO3第三帝国留言簿制作过程
2006/10/09 PHP
CI框架中site_url()和base_url()的区别
2015/01/07 PHP
php实现用已经过去多长时间的方式显示时间
2015/06/05 PHP
php简单实现sql防注入的方法
2016/04/22 PHP
Zend Framework基于Command命令行建立ZF项目的方法
2017/02/18 PHP
IE与Firefox下javascript getyear年份的兼容性写法
2007/12/20 Javascript
js继承的实现代码
2010/08/05 Javascript
输入自动提示搜索提示功能的使用说明:sugggestion.txt
2013/09/02 Javascript
js中事件的处理与浏览器对象示例介绍
2013/11/29 Javascript
js实现表单多按钮提交action的处理方法
2015/10/24 Javascript
仅9张思维导图帮你轻松学习Javascript 就这么简单
2016/06/01 Javascript
jQuery 3 中的新增功能汇总介绍
2016/06/12 Javascript
Javascript中document.referrer隐藏来源的方法
2017/01/16 Javascript
jQuery图片缩放插件smartZoom使用实例详解
2017/08/25 jQuery
[15:57]教你分分钟做大人:斧王
2014/10/30 DOTA
[40:03]RNG vs VG 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
Python采集腾讯新闻实例
2014/07/10 Python
利用aardio给python编写图形界面
2017/08/21 Python
python3 判断列表是一个空列表的方法
2018/05/04 Python
解决Python运行文件出现out of memory框的问题
2018/12/03 Python
python用opencv批量截取图像指定区域的方法
2019/01/24 Python
网易2016研发工程师编程题 奖学金(python)
2019/06/19 Python
Python常用数据分析模块原理解析
2020/07/20 Python
微软中国官方旗舰店:销售Surface、Xbox One、笔记本电脑、Office
2018/07/23 全球购物
美国专业汽车音响和移动电子产品零售商:Car Toys
2019/05/13 全球购物
英国最大的割草机购买网站:Just Lawnmowers
2019/11/02 全球购物
建筑专业自荐信
2013/10/18 职场文书
新法人代表任命书
2014/06/06 职场文书
做一个有道德的人活动实施方案
2014/08/23 职场文书
小学生民族团结演讲稿
2014/08/27 职场文书
学校运动会广播稿
2014/10/11 职场文书
干部作风建设年活动剖析材料
2014/10/23 职场文书
公司新员工欢迎词
2015/09/30 职场文书
React中的Context应用场景分析
2021/06/11 Javascript
FP-growth算法发现频繁项集——发现频繁项集
2021/06/24 Python
Java实现多线程聊天室
2021/06/26 Java/Android