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 设计模式(二) 闭包
May 26 Javascript
JS基础之undefined与null的区别分析
Aug 08 Javascript
jquery键盘事件使用介绍
Nov 01 Javascript
在父页面得到zTree已选中的节点的方法
Feb 12 Javascript
javascript实现简单的省市区三级联动
May 14 Javascript
点击页面任何位置隐藏div的实现方法
Sep 05 Javascript
H5移动端图片压缩上传开发流程
Nov 09 Javascript
Node.js 异步异常的处理与domain模块解析
May 10 Javascript
基于node.js express mvc轻量级框架实践
Sep 14 Javascript
微信小程序实现跳转的几种方式总结(推荐)
Apr 24 Javascript
基于layui框架响应式布局的一些使用详解
Sep 16 Javascript
VUE 实现动态给对象增加属性,并触发视图更新操作示例
Nov 29 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
thinkphp的静态缓存用法分析
2014/11/29 PHP
thinkphp实现上一篇与下一篇的方法
2014/12/08 PHP
JS运行耗时操作的延时显示方法
2010/11/19 Javascript
jquery判断浏览器类型的代码
2012/11/05 Javascript
jQuery getJSON()+.ashx 实现分页(改进版)
2013/03/28 Javascript
jQuery函数的等价原生函数代码示例
2013/05/27 Javascript
用jquery生成二级菜单的实例代码
2013/06/24 Javascript
js实现新年倒计时效果
2015/12/10 Javascript
AngularJS基础 ng-options 指令详解
2016/08/02 Javascript
AngularJS包括详解及示例代码
2016/08/17 Javascript
jQuery轮播图效果精简版完整示例
2016/09/04 Javascript
Ionic+AngularJS实现登录和注册带验证功能
2017/02/09 Javascript
jQuery使用eraser.js插件实现擦除、刮刮卡效果的方法【附eraser.js下载】
2017/04/28 jQuery
详解webpack分包及异步加载套路
2017/06/29 Javascript
vue实现长图垂直居上 vue实现短图垂直居中
2017/10/18 Javascript
bootstrap响应式工具使用详解
2017/11/29 Javascript
Vue中保存数据到磁盘文件的方法
2018/09/06 Javascript
vue项目打包后请求地址错误/打包后跨域操作
2020/11/04 Javascript
vue-drawer-layout实现手势滑出菜单栏
2020/11/19 Vue.js
Python松散正则表达式用法分析
2016/04/29 Python
python实现猜数字小游戏
2020/03/24 Python
简单了解Python读取大文件代码实例
2019/12/18 Python
windows10环境下用anaconda和VScode配置的图文教程
2020/03/30 Python
python 实现读取csv数据,分类求和 再写进 csv
2020/05/18 Python
浅析Python 多行匹配模式
2020/07/24 Python
详解Django中的FBV和CBV对比分析
2021/03/01 Python
一款css实现的鼠标经过按钮的特效
2014/09/11 HTML / CSS
一款纯css3实现的漂亮的404页面的实例教程
2014/11/27 HTML / CSS
Python中pass语句的作用是什么
2016/06/01 面试题
电力公司个人求职信范文
2014/02/04 职场文书
个人自我剖析材料
2014/02/07 职场文书
社会调查研究计划书
2014/05/01 职场文书
求职自我推荐信
2014/06/25 职场文书
给客户的感谢信
2015/01/21 职场文书
就业指导讲座心得体会
2016/01/15 职场文书
Nginx配置之禁止指定IP访问
2022/05/02 Servers