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 相关文章推荐
用js实现的一个Flash滚动轮换显示图片代码生成器
Mar 14 Javascript
jquery 将disabled的元素置为enabled的三种方法
Jul 25 Javascript
js 获取屏幕各种宽高的方法(浏览器兼容)
May 15 Javascript
JavaScript解析URL参数示例代码
Aug 12 Javascript
jquery左边浮动到一定位置时显示返回顶部按钮
Jun 05 Javascript
探究JavaScript函数式编程的乐趣
Dec 14 Javascript
使用bootstrap3开发响应式网站
May 12 Javascript
深入理解jquery自定义动画animate()
May 24 Javascript
js和C# 时间日期格式转换的简单实例
May 28 Javascript
使用jquery如何获取时间
Oct 13 Javascript
小程序二次贝塞尔曲线实现购物车商品曲线飞入效果
Jan 07 Javascript
vue中使用vue-print.js实现多页打印
Mar 05 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常用图片处理类
2016/03/16 PHP
PHP从二维数组得到N层分类树的实现代码
2016/10/11 PHP
js中indexof的用法详细解析
2013/12/24 Javascript
javascript中的事件代理初探
2014/03/08 Javascript
alert和confirm功能介绍
2014/05/21 Javascript
javascript中的previousSibling和nextSibling的正确用法
2015/09/16 Javascript
js判断移动端是否安装某款app的多种方法
2015/12/18 Javascript
JavaScript学习小结之被嫌弃的eval函数和with语句实例详解
2016/08/01 Javascript
最原始的jQuery注册验证方式
2016/10/11 Javascript
一个可复用的vue分页组件
2017/05/15 Javascript
详解webpack和webpack-simple中如何引入css文件
2017/06/28 Javascript
JS 实现缓存算法的示例(FIFO/LRU)
2018/03/20 Javascript
Angular 封装并发布组件的方法示例
2018/04/19 Javascript
jQuery实现图片上传预览效果功能完整实例【测试可用】
2018/05/28 jQuery
js实现一款简单踩白块小游戏(曾经很火)
2019/12/02 Javascript
vue项目实现设置根据路由高亮对应的菜单项操作
2020/08/06 Javascript
Vue 的 v-model用法实例
2020/11/23 Vue.js
python实现爬虫下载漫画示例
2014/02/16 Python
Python中的闭包详细介绍和实例
2014/11/21 Python
python框架django基础指南
2016/09/08 Python
Python比较配置文件的方法实例详解
2019/06/06 Python
python 数据提取及拆分的实现代码
2019/08/26 Python
Python 利用flask搭建一个共享服务器的步骤
2020/12/05 Python
卡骆驰英国官网:Crocs英国
2019/08/22 全球购物
试解释COMMIT操作和ROLLBACK操作的语义
2014/07/25 面试题
在职研究生自我鉴定
2013/10/16 职场文书
应届生骨科医生求职信
2013/10/31 职场文书
自我评价怎么写正确呢?
2013/12/02 职场文书
技术副厂长岗位职责
2013/12/26 职场文书
乡镇交通安全实施方案
2014/03/29 职场文书
文艺晚会策划方案
2014/06/11 职场文书
2014年发展党员工作总结
2014/11/12 职场文书
2015年网管个人工作总结
2015/05/22 职场文书
宣传稿格式范文
2015/07/23 职场文书
导游词之青城山景区
2019/09/27 职场文书
使用php的mail()函数实现发送邮件功能
2021/06/03 PHP