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中style属性
Oct 11 Javascript
ext for eclipse插件安装方法
Apr 27 Javascript
国外的为初学者写的JavaScript教程
Jun 09 Javascript
javascript arguments 传递给函数的隐含参数
Aug 21 Javascript
javascript hashtable 修正版 下载
Dec 30 Javascript
用示例说明filter()与find()的用法以及children()与find()的区别分析
Apr 26 Javascript
显示今天的日期js代码(阳历和农历)
Sep 30 Javascript
javascript实现数组中的内容随机输出
Aug 11 Javascript
jQuery操作json常用方法示例
Jan 04 Javascript
Vue写一个简单的倒计时按钮功能
Apr 20 Javascript
vue限制输入框只能输入8位整数和2位小数的代码
Nov 06 Javascript
浅谈react useEffect闭包的坑
Jun 08 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
snoopy 强大的PHP采集类使用实例代码
2010/12/09 PHP
php 文件上传实例代码
2012/04/19 PHP
解析php中var_dump,var_export,print_r三个函数的区别
2013/06/21 PHP
php操作MongoDB基础教程(连接、新增、修改、删除、查询)
2014/03/25 PHP
php查询mssql出现乱码的解决方法
2014/12/29 PHP
PHP 实现人民币小写转换成大写的方法及大小写转换函数
2017/11/17 PHP
PHP基于mcript扩展实现对称加密功能示例
2019/02/21 PHP
javascript 在网页中的运用(asp.net)
2009/11/23 Javascript
JQuery Tips(4) 一些关于提高JQuery性能的Tips
2009/12/19 Javascript
dess中一个简单的多路委托的实现
2010/07/20 Javascript
关闭浏览器窗口弹出提示框并且可以控制其失效
2014/04/15 Javascript
自己动手写的jquery分页控件(非常简单实用)
2015/10/28 Javascript
vue如何获取点击事件源的方法
2017/08/10 Javascript
Vuejs 单文件组件实例详解
2018/02/09 Javascript
浅谈React 服务器端渲染的使用
2018/05/08 Javascript
Angular4.x通过路由守卫进行路由重定向实现根据条件跳转到相应的页面(推荐)
2018/05/10 Javascript
vue插件开发之使用pdf.js实现手机端在线预览pdf文档的方法
2018/07/12 Javascript
详解webpack4之splitchunksPlugin代码包分拆
2018/12/04 Javascript
python使用正则表达式分析网页中的图片并进行替换的方法
2015/03/26 Python
python结合opencv实现人脸检测与跟踪
2015/06/08 Python
Python json 错误xx is not JSON serializable解决办法
2017/03/15 Python
python 中的int()函数怎么用
2017/10/17 Python
浅谈keras的深度模型训练过程及结果记录方式
2020/01/24 Python
python小白学习包管理器pip安装
2020/06/09 Python
Python csv文件记录流程代码解析
2020/07/16 Python
解决redis与Python交互取出来的是bytes类型的问题
2020/07/16 Python
Python爬虫抓取指定网页图片代码实例
2020/07/24 Python
HTML5手机端弹出遮罩菜单特效代码
2016/01/27 HTML / CSS
彪马荷兰官网:PUMA荷兰
2019/05/08 全球购物
如果重写了对象的equals()方法,需要考虑什么
2014/11/02 面试题
领导班子四风对照检查材料思想汇报
2014/09/26 职场文书
2014年机关作风建设工作总结
2014/10/23 职场文书
小学老师对学生的评语
2014/12/29 职场文书
中英文求职信范文
2015/03/19 职场文书
利用Python网络爬虫爬取各大音乐评论的代码
2021/04/13 Python
python urllib库的使用详解
2021/04/13 Python