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 autocomplate 自扩展插件、自动完成示例代码
Mar 28 Javascript
js中的string.format函数代码
Aug 11 Javascript
使用js检测浏览器的实现代码
May 14 Javascript
8个超实用的jQuery功能代码分享
Jan 08 Javascript
学习JavaScript事件流和事件处理程序
Jan 25 Javascript
js如何判断是否在iframe中及防止网页被别站用iframe嵌套
Jan 11 Javascript
解决vue多个路由共用一个页面的问题
Mar 12 Javascript
JavaScript实现的简单Tab点击切换功能示例
Jul 06 Javascript
关于vue编译版本引入的问题的解决
Sep 17 Javascript
超详细动手搭建一个VuePress 站点及开启PWA与自动部署的方法
Jan 27 Javascript
react quill中图片上传由默认转成base64改成上传到服务器的方法
Oct 30 Javascript
vue v-for 点击当前行,获取当前行数据及event当前事件对象的操作
Sep 10 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中读写文件与读写数据库的效率比较分享
2013/10/19 PHP
1亿条数据如何分表100张到Mysql数据库中(PHP)
2015/07/29 PHP
利用PHP如何实现Socket服务器
2015/09/23 PHP
php中使用GD库做验证码
2016/03/31 PHP
兼容Mozilla必须知道的知识。
2007/01/09 Javascript
[原创]来自ImageSee官方 JavaScript图片浏览器
2008/01/16 Javascript
jQuery下扩展插件和拓展函数的写法(匿名函数使用的典型例子)
2010/10/20 Javascript
javascript:history.go()和History.back()的区别及应用
2012/11/25 Javascript
你必须知道的JavaScript 变量命名规则详解
2013/05/07 Javascript
JS获取键盘上任意按键的值(实例代码)
2013/11/12 Javascript
将HTML的左右尖括号等转义成实体形式的两种实现方式
2014/05/04 Javascript
innerHTML属性,outerHTML属性,textContent属性,innerText属性区别详解
2015/03/13 Javascript
jQuery实现购物车计算价格功能的方法
2015/03/25 Javascript
函数window.open实现关闭所有的子窗口
2015/08/03 Javascript
javascript实现手机震动API代码
2015/08/05 Javascript
基于JavaScript如何实现私有成员的语法特征及私有成员的实现方式
2015/10/28 Javascript
js 将图片连接转换成base64格式的简单实例
2016/08/10 Javascript
浅谈JS函数定义方式的区别
2016/10/30 Javascript
Vue2.0 vue-source jsonp 跨域请求
2017/08/04 Javascript
[js高手之路]从原型链开始图解继承到组合继承的产生详解
2017/08/28 Javascript
vue的状态管理模式vuex
2017/11/30 Javascript
详解如何在vue-cli中使用vuex
2018/08/07 Javascript
vue-cli 打包后提交到线上出现 &quot;Uncaught SyntaxError:Unexpected token&quot; 报错
2018/11/06 Javascript
原生javascript实现类似vue的数据绑定功能示例【观察者模式】
2020/02/24 Javascript
JS中间件设计模式的深入探讨与实例分析
2020/04/11 Javascript
JS实现点击掉落特效
2021/01/29 Javascript
python列表操作实例
2015/01/14 Python
Python中实现单例模式的n种方式和原理
2018/11/14 Python
判断python对象是否可调用的三种方式及其区别详解
2019/01/31 Python
Django缓存系统实现过程解析
2019/08/02 Python
Windows下实现将Pascal VOC转化为TFRecords
2020/02/17 Python
法警的竞聘演讲稿
2014/01/02 职场文书
设备管理实施方案
2014/05/31 职场文书
2014年班组工作总结
2014/11/20 职场文书
清洁员岗位职责
2015/02/15 职场文书
python基础学习之递归函数知识总结
2021/05/26 Python