浅谈vuejs实现数据驱动视图原理


Posted in Javascript onFebruary 23, 2018

什么是数据驱动

数据驱动是vuejs最大的特点。在vuejs中,所谓的数据驱动就是当数据发生变化的时候,用户界面发生相应的变化,开发者不需要手动的去修改dom。

比如说我们点击一个button,需要元素的文本进行是和否的切换。在jquery刀耕火种的年代中,对于页面的修改我们一般是这样的一个流程,我们对button绑定事件,然后获取文案对应的元素dom对象,然后根据切换修改该dom对象的文案值。

而对于vuejs实现这个功能的流程,只需要在button元素上指明事件,同时声明对应文案的属性,点击事件的时候改变属性的值,对应元素的文本就能够自动的进行切换,我们不需要像以前那样手动的操作dom。

简而言之,就是vuejs帮我们封装了数据和dom对象操作的映射,我们只需要关心数据的逻辑处理,数据的变化就能够自然的通知页面进行页面的重新渲染。

这样做的确实给我们带来的好处,我们不需要再在代码中频繁地去操作dom了,在实际项目中,我们有很大部分代码都是在数据修改以后,手动操作重新渲染页面元素,当页面越来越复杂的时候,页面代码组织会越来难以维护。同时,js对dom的频繁操作,会使得页面代码的出错概率高,页面的视图展示会融合在js代码中,对于页面视图显示的升级也不友好。

那么vuejs是如何实现这种数据驱动的呢?

MVVM框架

Vuejs的数据驱动是通过MVVM这种框架来实现的。MVVM框架主要包含3个部分:model、view和 viewmodel。

Model:指的是数据部分,对应到前端就是javascript对象

View:指的是视图部分,对应前端就是dom

Viewmodel:就是连接视图与数据的中间件

浅谈vuejs实现数据驱动视图原理

数据(Model)和视图(View)是不能直接通讯的,而是需要通过ViewModel来实现双方的通讯。当数据变化的时候,viewModel能够监听到这种变化,并及时的通知view做出修改。同样的,当页面有事件触发时,viewMOdel也能够监听到事件,并通知model进行响应。Viewmodel就相当于一个观察者,监控着双方的动作,并及时通知对方进行相应的操作。

Vuejs的数据驱动实现

对于数据驱动的实现,我们可以简单的通过定时器来实现这个功能,定时器定时监控对象数据,定时器监控数据变化,确定是否更新界面

a = 1;
  function renderDom(){
    document.getElementById('app').innerHTML = '数据是' + a;
  }
  
  function watcher(method){
    var b = a;
    method.apply();
     return setInterval(function(){
      if(b != a){
        method.apply();
        b = a;
      }
    }, 1000)
  }
  watcher(renderDom);

当然vuejs不可能是这样简单暴力的实现方式,vuejs是通过在实现一个观察者来实现的数据驱动。

浅谈vuejs实现数据驱动视图原理

首先,vuejs在实例化的过程中,会对遍历传给实例化对象选项中的data 选项,遍历其所有属性并使用 Object.defineProperty把这些属性全部转为 getter/setter。

同时每一个实例对象都有一个watcher实例对象,他会在模板编译的过程中,用getter去访问data的属性,watcher此时就会把用到的data属性记为依赖,这样就建立了视图与数据之间的联系。当之后我们渲染视图的数据依赖发生改变(即数据的setter被调用)的时候,watcher会对比前后两个的数值是否发生变化,然后确定是否通知视图进行重新渲染。

这样就实现了所谓的数据对于视图的驱动。

关于代码的实现,可以参考一下这篇文章 实现vue2.0响应式的基本思路

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
用 JavaScript 迁移目录
Dec 18 Javascript
javascript 控制input只允许输入的各种指定内容
Jun 19 Javascript
jQuery实现仿百度帖吧头部固定导航效果
Aug 07 Javascript
AngularJS 如何在控制台进行错误调试
Jun 07 Javascript
bootstrapfileinput实现文件自动上传
Nov 08 Javascript
jQuery中页面返回顶部的方法总结
Dec 30 Javascript
jquery实现折叠菜单效果【推荐】
Mar 08 Javascript
JS查找英文文章中出现频率最高的单词
Mar 20 Javascript
jQuery实现导航栏头部菜单项点击后变换颜色的方法
Jul 19 jQuery
jQuery使用zTree插件实现可拖拽的树示例
Sep 23 jQuery
layui前端框架之table表数据的刷新方法
Aug 17 Javascript
javascript实现日历效果
Jun 17 Javascript
Vue父组件调用子组件事件方法
Feb 23 #Javascript
vue实现密码显示隐藏切换功能
Feb 23 #Javascript
对vue.js中this.$emit的深入理解
Feb 23 #Javascript
基于vue.js中事件修饰符.self的用法(详解)
Feb 23 #Javascript
vue.js2.0点击获取自己的属性和jquery方法
Feb 23 #jQuery
vue中动态绑定表单元素的属性方法
Feb 23 #Javascript
Vue之Vue.set动态新增对象属性方法
Feb 23 #Javascript
You might like
PHP实现多条件查询实例代码
2010/07/17 PHP
YII Framework框架教程之安全方案详解
2016/03/14 PHP
PHP与以太坊交互详解
2018/08/24 PHP
php5对象复制、clone、浅复制与深复制实例详解
2019/08/14 PHP
php使用gearman进行任务分发操作实例详解
2020/02/26 PHP
JavaScript 常用函数库详解
2009/10/21 Javascript
jQuery搜索子元素的方法
2015/02/10 Javascript
JavaScript使用位运算符判断奇数和偶数的方法
2015/06/01 Javascript
jQuery实现动态表单验证时文本框抖动效果完整实例
2015/08/21 Javascript
AngularJS模块学习之Anchor Scroll
2016/01/19 Javascript
AngularJS实现按钮提示与点击变色效果
2016/09/07 Javascript
JS 获取HTML标签内的子节点的方法
2016/09/21 Javascript
利用jquery正则表达式在页面验证url网址输入是否正确
2017/04/04 jQuery
javascript 初学教程及五子棋小程序的简单实现
2017/07/04 Javascript
React Native实现地址挑选器功能
2017/10/24 Javascript
jQuery实现的导航条点击后高亮显示功能示例
2019/03/04 jQuery
微信小程序 this.triggerEvent()的具体使用
2019/12/10 Javascript
iview实现图片上传功能
2020/06/29 Javascript
微信小程序将页面按钮悬浮固定在底部的实现代码
2020/10/29 Javascript
[40:55]Liquid vs LGD 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
如何用Python做一个微信机器人自动拉群
2019/07/03 Python
Python unittest如何生成HTMLTestRunner模块
2020/09/08 Python
Autopep8的使用(python自动编排工具)
2021/03/02 Python
css3实现冲击波效果的示例代码
2018/01/11 HTML / CSS
印度化妆品购物网站:Nykaa
2018/07/22 全球购物
美国手机支架公司:PopSockets
2019/11/27 全球购物
编写类String 的构造函数、析构函数和赋值函数
2012/09/09 面试题
如果Session Bean得Remove方法一直都不被调用会怎么样
2012/07/14 面试题
会计应届生的自荐信
2013/12/13 职场文书
会计电算化专业自荐信
2014/03/15 职场文书
公司聘任书模板
2014/03/29 职场文书
大一工商管理职业生涯规划:有梦最美,行动相随
2014/09/18 职场文书
党员干部民主生活会议批评与自我批评材料
2014/09/20 职场文书
离婚协议书范文2014(夫妻感情破裂)
2014/12/14 职场文书
python 使用Tensorflow训练BP神经网络实现鸢尾花分类
2021/05/12 Python
Django模型层实现多表关系创建和多表操作
2021/07/21 Python