浅谈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 相关文章推荐
最新28个很棒的jQuery 教程
May 28 Javascript
JS 操作符整理[推荐收藏]
Nov 15 Javascript
Jquery创建一个层当鼠标移动到层上面不消失效果
Dec 12 Javascript
Eclipse配置Javascript开发环境图文教程
Jan 29 Javascript
js实现简易的单数字随机抽奖(0-9)
Mar 19 Javascript
JavaScript地理位置信息API
Jun 11 Javascript
JS桶排序的简单理解与实现方法示例
Nov 25 Javascript
JS代码触发事件代码实例
Jan 02 Javascript
JavaScript实现横版菜单栏
Mar 17 Javascript
详解js中的几种常用设计模式
Jul 16 Javascript
Vue 中使用lodash对事件进行防抖和节流操作
Jul 26 Javascript
如何区分vue中的v-show 与 v-if
Sep 08 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验证码类代码分享(已封装成类)
2011/07/17 PHP
php实现Linux服务器木马排查及加固功能
2014/12/29 PHP
使用图灵api创建微信聊天机器人
2015/07/23 PHP
Eclipse PHPEclipse 配置的具体步骤
2017/08/08 PHP
利用javascript查看html源文件
2006/11/08 Javascript
JavaScript 面向对象编程(1) 基础
2010/05/18 Javascript
Firefox中autocomplete="off" 设置不起作用Bug的解决方法
2011/03/25 Javascript
基于js disabled="false"不起作用的解决办法
2013/06/26 Javascript
node.js入门教程
2014/06/01 Javascript
javascript实现数独解法
2015/03/14 Javascript
JS制作简单的三级联动
2015/03/18 Javascript
jQuery获取标签文本内容和html内容的方法
2015/03/27 Javascript
JS特效实现图片自动播放并可控的效果
2015/07/31 Javascript
JS实现将Asp.Net的DateTime Json类型转换为标准时间的方法
2016/08/02 Javascript
BootStrap的table表头固定tbody滚动的实例代码
2016/08/24 Javascript
Javascript 普通函数和构造函数的区别
2016/11/05 Javascript
通过V8源码看一个关于JS数组排序的诡异问题
2017/08/14 Javascript
微信小程序简单实现form表单获取输入数据功能示例
2017/11/30 Javascript
angularjs 动态从后台获取下拉框的值方法
2018/08/13 Javascript
js实现视图和数据双向绑定的方法分析
2020/02/05 Javascript
使用pdb模块调试Python程序实例
2015/06/02 Python
Python错误提示:[Errno 24] Too many open files的分析与解决
2017/02/16 Python
Python 闭包的使用方法
2017/09/07 Python
Python常用库大全及简要说明
2020/01/17 Python
解决Python logging模块无法正常输出日志的问题
2020/02/21 Python
Python如何安装第三方模块
2020/05/28 Python
matplotlib 三维图表绘制方法简介
2020/09/20 Python
通过python-pptx模块操作ppt文件的方法
2020/12/26 Python
python使用matplotlib的savefig保存时图片保存不完整的问题
2021/01/08 Python
速比涛英国官网:Speedo英国
2019/07/15 全球购物
哪些情况下不应该使用索引
2015/07/20 面试题
大学生军训自我评价分享
2013/11/09 职场文书
《桂花雨》教学反思
2014/04/12 职场文书
支部鉴定材料
2014/06/02 职场文书
2016年小学生寒假总结
2015/10/10 职场文书
python 管理系统实现mysql交互的示例代码
2021/12/06 Python