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 相关文章推荐
超简单的jquery的AJAX用法
May 10 Javascript
JavaScript中使用Substring删除字符串最后一个字符
Nov 03 Javascript
JQuery选中checkbox方法代码实例(全选、反选、全不选)
Apr 27 Javascript
JavaScript的React框架中的JSX语法学习入门教程
Mar 05 Javascript
深入理解ECMAScript的几个关键语句
Jun 01 Javascript
JavaScript实现相册弹窗功能(zepto.js)
Jun 21 Javascript
Vue 2.0的数据依赖实现原理代码简析
Jul 10 Javascript
JavaScript实现的搜索及高亮显示功能示例
Aug 14 Javascript
react-native滑动吸顶效果的实现过程
Jun 03 Javascript
使用Bootstrap做一个朝代历史表
Dec 10 Javascript
JavaScript随机数的组合问题案例分析
May 16 Javascript
js实现金山打字通小游戏
Jul 24 Javascript
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统计目录下的文件总数及代码行数(去除注释及空行)
2011/01/17 PHP
详解Yaf框架PHPUnit集成测试方法
2017/12/27 PHP
jquery 上下滚动广告
2009/06/17 Javascript
兼容ie、firefox的图片自动缩放的css跟js代码分享
2012/01/21 Javascript
网页防止tab键的使用快速解决方法
2013/11/07 Javascript
Jquery遍历checkbox获取选中项value值的方法
2014/02/13 Javascript
jQuery遍历Table应用示例
2014/04/09 Javascript
jQuery插件jRumble实现网页元素抖动
2015/06/05 Javascript
基于jQuery下拉选择框插件支持单选多选功能代码
2016/06/07 Javascript
js Canvas实现圆形时钟教程
2016/09/19 Javascript
需要牢记的JavaScript基础知识
2016/09/25 Javascript
浅析js的模块化编写 require.js
2016/12/07 Javascript
Bootstrap风格的zTree右键菜单
2017/02/17 Javascript
使用form-create动态生成vue自定义组件和嵌套表单组件
2019/01/18 Javascript
解决vue打包后vendor.js文件过大问题
2019/07/03 Javascript
小程序实现上下切换位置
2020/11/16 Javascript
[03:30]DOTA2完美“圣”典精彩集锦
2016/12/27 DOTA
Python编程中的文件操作攻略
2015/10/16 Python
利用Python爬取可用的代理IP
2016/08/18 Python
Python数据分析之真实IP请求Pandas详解
2016/11/18 Python
python使用matplotlib绘制折线图教程
2017/02/08 Python
Python判断变量名是否合法的方法示例
2019/01/28 Python
Python利用scapy实现ARP欺骗的方法
2019/07/23 Python
python opencv调用笔记本摄像头
2019/08/28 Python
基于python操作ES实例详解
2019/11/16 Python
pycharm进入时每次都是insert模式的解决方式
2021/02/05 Python
设计师大码女装:11 Honoré
2020/05/03 全球购物
blueseventy官网:铁人三项和比赛泳衣
2021/02/06 全球购物
幼儿园教师自我鉴定
2014/03/20 职场文书
迎新晚会主持词
2014/03/24 职场文书
民事赔偿协议书
2014/11/02 职场文书
租车协议书
2015/01/27 职场文书
开工典礼致辞
2015/07/29 职场文书
Python中zipfile压缩包模块的使用
2021/05/14 Python
深入理解go slice结构
2021/09/15 Golang
win10识别不了U盘怎么办 win10系统读取U盘失败的解决办法
2022/08/05 数码科技