浅谈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 相关文章推荐
ExtJS 2.0实用简明教程 之Border区域布局
Apr 29 Javascript
IE FF OPERA都可用的弹出层实现代码
Sep 29 Javascript
js 获取、清空input type="file"的值示例代码
Feb 19 Javascript
Javascript控制input输入时间格式的方法
Jan 28 Javascript
js实现文本框中输入文字页面中div层同步获取文本框内容的方法
Mar 03 Javascript
JavaScript事件类型中焦点、鼠标和滚轮事件详解
Jan 25 Javascript
JS中多种方式创建对象详解
Mar 22 Javascript
JS针对浏览器窗口关闭事件的监听方法集锦
Jun 24 Javascript
详解webpack中的hash、chunkhash、contenthash区别
Jan 05 Javascript
Vue 与 Vuex 的第一次接触遇到的坑
Aug 16 Javascript
详解vue项目中实现图片裁剪功能
Jun 07 Javascript
element-ui中按需引入的实现
Dec 25 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代码(星期六,星期日总和)
2009/11/12 PHP
phpMyadmin 用户权限中英对照
2010/04/02 PHP
解析PHP生成静态html文件的三种方法
2013/06/18 PHP
php版微信公众平台接口开发之智能回复开发教程
2016/09/22 PHP
2017年最好用的9个php开发工具推荐(超好用)
2017/10/23 PHP
laravel通用化的CURD的实现
2019/12/13 PHP
juqery 学习之六 CSS--css、位置、宽高
2011/02/11 Javascript
javascript异步处理工作机制详解
2015/04/13 Javascript
用nodejs的实现原理和搭建服务器(动态)
2016/08/10 NodeJs
微信小程序 解决请求服务器手机预览请求不到数据的方法
2017/01/04 Javascript
关于vue-router路径计算问题
2017/05/10 Javascript
JS在if中的强制类型转换方式
2018/07/15 Javascript
基于mpvue搭建微信小程序项目框架的教程详解
2019/04/10 Javascript
vue实现短信验证码输入框
2020/04/17 Javascript
Node.js API详解之 dgram模块用法实例分析
2020/06/05 Javascript
python如何实现excel数据添加到mongodb
2015/07/30 Python
python实现树形打印目录结构
2018/03/29 Python
对PyTorch torch.stack的实例讲解
2018/07/30 Python
Python 中的参数传递、返回值、浅拷贝、深拷贝
2019/06/25 Python
python自动化测试无法启动谷歌浏览器问题
2019/10/10 Python
Python爬虫使用bs4方法实现数据解析
2020/08/25 Python
python解包用法详解
2021/02/17 Python
纯CSS3实现图片无间断轮播效果
2016/08/25 HTML / CSS
浅析数据存储的三种方式 cookie sessionstorage localstorage 的异同
2020/06/04 HTML / CSS
New delete 与malloc free 的联系与区别
2013/02/04 面试题
应届毕业生专业个人求职自荐信格式
2013/11/20 职场文书
优秀毕业生自荐信范文
2014/01/01 职场文书
制药工程专业个人求职自荐信
2014/01/25 职场文书
九年级政治教学反思
2014/02/06 职场文书
销售经理竞聘书
2014/03/31 职场文书
关于运动会广播稿50字
2014/10/18 职场文书
岳麓书院导游词
2015/02/03 职场文书
2015年全国“爱牙日”宣传活动总结
2015/03/23 职场文书
大专护理专业自荐信
2015/03/25 职场文书
社区党支部承诺书
2015/04/29 职场文书
SQL Server中交叉联接的用法详解
2021/04/22 SQL Server