vue双向绑定简要分析


Posted in Javascript onMarch 23, 2017

Vue是当前很火的一款MVVM的轻量级框架,它是以数据驱动和组件化的思想构建的。因为它提供了简洁易于理解的api,使得我们很容易上手。

Vue与MVVM 如果你之前已经习惯了用jQuery操作DOM,学习Vue.js时请先抛开手动操作DOM的思维,因为Vue.js是数据驱动的,你无需手动操作DOM。Vue以数据为驱动,将自身的Dom元素与数据进行绑定,一旦创建绑定,Dom和数据保持同步。

vue双向绑定简要分析

其中ViewModel是Vue的核心,它是Vue的一个实例,作用于某个HTML元素上,可以是body也可以是某个id所指代的元素。双向绑定主流双向数据绑定实现原理

脏值检测 : 这是AngularJS实现双向数据绑定的方式。 原理是 当数据进行变更的时候对所有Model和View的绑定关系进行一次检查,识别是否有数据进行了变更,如果有变化则进行处理,由于可能进一步引发其他数据的改变,会再次循环这个过程,知道没有数据的变化之后。发送数据到视图重新渲染。 可想而知,这样的方式性能不高。

数据劫持: Vue采用的是 ES5的 Object,defineProperty() 方法,使用getter/setter监测对数据的操作,从而通知绑定是视图进行更新。 由于是在不同是数据上进行触发,可以精确的更新绑定的视图,而不是对所有的数据进行检测。

vue双向绑定简要分析

Vue是通过数据劫持的方式进行双向数据绑定的,最核心的方法就是 Object.defineProperty来实现对数据的劫持,检测数据的变化。
双向绑定的实现分为三个步骤:
1.实现一个数据监听器,能够对数据对象的所有属性进行监听,如有变动可拿到最新值并通知订阅者。
2.实现一个指令解析器,对每个元素的节点的指令进行解析。根据指令模板替换数据,以及绑定相应的更新函数。
3.实现一个观察者,能够订阅并收到每个属性变化的通知,执行指令绑定的相应回调函数,从而更新视图。

实现双向数据绑定核心代码:

vue双向绑定简要分析
vue双向绑定简要分析 

Dep类是一个订阅者类, 它具有一个订阅者数组与当前属性对应。关联当前数据和所有的 watcher 的依赖关系。
Dep.target是一个暴露出来的全局属性,暂存Watcher, 再添加完之后就会释放。
而在set中如果发现值的变换则通知所有订阅者(watcher)更新视图。

举例

vue双向绑定简要分析 

如果你对于Vue有一定了解的话,那么实现这个效果并不难。

<div id="demo">
 <p>{{message}}</p>
 <input type="text" v-model="message"/>
</div>

var App = new Vue({ 
 el: "#demo",
 data: { 
  message: 'Hello,World!'
 }
})

如果你想说我用jquery也可以实现,的确是这样:

<div id="box">
   <p class="text"></p>
   <input type="text" id="inputText">
   <script type="text/javascript" src="jquery.js"></script>
   <script type="text/javascript">
    $("#inputText").on("input", function() {
      var value = $(this).val() 
      $('.text').text(value)
    })
   </script>

这么来形容吧:jquery开发项目好比是老式的纺织机,而用Vue+Webpack开发好比是现代纺织工厂。区别就是一个上手容易,一个在生产效率,多成员协同,管理等方面却是质的飞跃。

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

Javascript 相关文章推荐
在JavaScript中遭遇级联表达式陷阱
Mar 08 Javascript
jQuery formValidator表单验证插件开源了 含API帮助、源码、示例
Aug 14 Javascript
JavaScript 异步调用框架 (Part 2 - 用例设计)
Aug 03 Javascript
使用JavaScript检测Firefox浏览器是否启用了Firebug的代码
Dec 28 Javascript
Jquery实现图片放大镜效果的思路及代码(自写)
Oct 18 Javascript
js限制文本框只能输入数字方法小结
Jun 16 Javascript
laytpl 精致巧妙的JavaScript模板引擎
Aug 29 Javascript
JQuery插件Quicksand实现超炫的动画洗牌效果
May 03 Javascript
jQuery实现广告条滚动效果
Aug 22 jQuery
浅谈Angular4中常用管道
Sep 27 Javascript
jquery.onoff实现简单的开关按钮功能(推荐)
May 24 jQuery
微信小程序用户授权,以及判断登录是否过期的方法
May 10 Javascript
Javascript面试经典套路reduce函数查重
Mar 23 #Javascript
JQuery 进入页面默认给已赋值的复选框打钩
Mar 23 #jQuery
vue.js实现含搜索的多种复选框(附源码)
Mar 23 #Javascript
js手机号4位显示空格,银行卡每4位显示空格效果
Mar 23 #Javascript
JS实现两周内自动登录功能
Mar 23 #Javascript
面试常见的js算法题
Mar 23 #Javascript
Vue.Js中的$watch()方法总结
Mar 23 #Javascript
You might like
外媒评选出10支2020年最受欢迎的Dota2战队
2021/03/05 DOTA
深入PHP中的HashTable结构详解
2013/06/13 PHP
PHP实现把MySQL数据库导出为.sql文件实例(仿PHPMyadmin导出功能)
2014/05/10 PHP
php实现映射操作实例详解
2019/10/02 PHP
RR vs IO BO3 第一场2.13
2021/03/10 DOTA
javascript form 验证函数 弹出对话框形式
2009/06/23 Javascript
JAVASCRIPT模式窗口中下载文件无法接收iframe的流
2013/10/11 Javascript
jquery ui bootstrap 实现自定义风格
2014/11/14 Javascript
浅谈jquery回调函数callback的使用
2015/01/30 Javascript
javascript获取select值的方法分析
2015/07/02 Javascript
jquery+css实现动感的图片切换效果
2015/11/25 Javascript
微信小程序按钮点击动画效果的实现
2019/09/04 Javascript
Vue项目中使用flow做类型检测的方法
2020/03/18 Javascript
JS forEach跳出循环2种实现方法
2020/06/24 Javascript
vuex中遇到的坑,vuex数据改变,组件中页面不渲染操作
2020/11/16 Javascript
[03:06]2018年度CS GO最具人气解说-完美盛典
2018/12/16 DOTA
python支持断点续传的多线程下载示例
2014/01/16 Python
Python2中的raw_input() 与 input()
2015/06/12 Python
修复CentOS7升级Python到3.6版本后yum不能正确使用的解决方法
2018/01/26 Python
Python3.5文件读与写操作经典实例详解
2019/05/01 Python
python代码实现猜拳小游戏
2020/11/30 Python
纯HTML5+CSS3制作生日蛋糕(代码易懂)
2016/11/16 HTML / CSS
爱他美官方海外旗舰店:Aptamil奶粉
2017/12/22 全球购物
中国制造网:Made-in-China.com
2019/10/25 全球购物
中医专业职业生涯规划书范文
2014/01/04 职场文书
文化建设工作方案
2014/05/12 职场文书
企业授权委托书范本
2014/09/22 职场文书
项目合作协议书
2014/09/23 职场文书
遗失说明具结保证书
2015/02/26 职场文书
政府会议通知范文
2015/04/15 职场文书
幼儿园班级工作总结2015
2015/05/25 职场文书
小平小道观后感
2015/06/09 职场文书
教师学习中国梦心得体会
2016/01/05 职场文书
CSS3 制作的图片滚动效果
2021/04/14 HTML / CSS
Axios取消重复请求的方法实例详解
2021/06/15 Javascript
python tqdm用法及实例详解
2021/06/16 Python