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之如何使用回调函数
May 16 Javascript
JavaScript模块随意拖动示例代码
May 27 Javascript
JavaScript中停止执行setInterval和setTimeout事件的方法
May 14 Javascript
Jquery Easyui菜单组件Menu使用详解(15)
Dec 18 Javascript
微信小程序获取用户信息及手机号(后端TP5.0)
Sep 12 Javascript
JavaScript实现简单进度条效果
Mar 25 Javascript
VueX模块的具体使用(小白教程)
Jun 05 Javascript
vue路由结构可设一层方便动态添加路由操作
Aug 31 Javascript
layui使用及简单的三级联动实现教程
Dec 01 Javascript
用javascript实现倒计时效果
Feb 09 Javascript
使用PDF.js渲染canvas实现预览pdf的效果示例
Apr 17 Javascript
详解Vue中$props、$attrs和$listeners的使用方法
Feb 18 Vue.js
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
实现“上一页”和“下一页按钮
2006/10/09 PHP
php防止恶意刷新与刷票的方法
2014/11/21 PHP
jquery JSON的解析方式
2009/07/25 Javascript
多个表单中如何获得这个文件上传的网址实现js代码
2013/03/25 Javascript
使用JS 清空File控件的路径值
2013/07/08 Javascript
jquery用get实现ajax在ie里面刷新不进入后台解决方法
2013/08/12 Javascript
Jquery Uploadify多文件上传带进度条且传递自己的参数
2013/08/28 Javascript
5秒后跳转到另一个页面的js代码
2013/10/12 Javascript
Javascript执行效率全面总结
2013/11/04 Javascript
jquery实现非叠加式的搜索框提示效果
2014/01/07 Javascript
用Jquery选择器计算table中的某一列某一行的合计
2014/08/13 Javascript
jQuery控制DIV层实现由大到小,由远及近动画变化效果
2015/10/09 Javascript
Bootstrap 折叠(Collapse)插件用法实例详解
2016/06/01 Javascript
关于JS中的方法是否加括号的问题
2016/07/27 Javascript
前端实现文件的断点续传(前端文件提交+后端PHP文件接收)
2016/11/04 Javascript
PHP+jquery+ajax实现分页
2016/12/09 Javascript
解决BootStrap Fileinput手机图片上传显示旋转问题
2017/06/01 Javascript
原生js封装运动框架的示例讲解
2017/10/01 Javascript
对vue里函数的调用顺序介绍
2018/03/17 Javascript
vue+vue-router转场动画的实例代码
2018/09/01 Javascript
纯异步nodejs文件夹(目录)复制功能
2019/09/03 NodeJs
Python中的魔法方法深入理解
2014/07/09 Python
浅谈Python程序与C++程序的联合使用
2015/04/07 Python
微信小程序跳一跳游戏 python脚本跳一跳刷高分技巧
2018/01/04 Python
python+pyqt5实现24点小游戏
2019/01/24 Python
Django与pyecharts结合的实例代码
2020/05/13 Python
用Python自动清理电脑内重复文件,只要10行代码(自动脚本)
2021/01/09 Python
美国著名首饰网站:BaubleBar
2016/08/29 全球购物
《乌塔》教学反思
2014/02/17 职场文书
会计核算科岗位职责
2014/03/19 职场文书
初中中等生评语
2014/12/29 职场文书
《扇形统计图》教学反思
2016/02/17 职场文书
MySQL 角色(role)功能介绍
2021/04/24 MySQL
nodejs利用readline提示输入内容实例代码
2021/07/15 NodeJs
使用ORM新增数据在Mysql中的操作步骤
2021/07/26 MySQL
vue ant design 封装弹窗表单的使用
2022/06/01 Vue.js