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 相关文章推荐
JQuery插件开发示例代码
Nov 06 Javascript
jQuery判断checkbox是否选中的小例子
Dec 02 Javascript
Jquery弹出层插件ThickBox的使用方法
Dec 09 Javascript
js实现最短的XML格式化工具实例
Mar 12 Javascript
JavaScript调用传递变量参数的相关问题及解决办法
Nov 01 Javascript
Bootstrap布局组件教程之Bootstrap下拉菜单
Jun 12 Javascript
移动端H5开发 Turn.js实现很棒的翻书效果
Jun 20 Javascript
jquery validate表单验证插件
Sep 06 Javascript
vue页面使用阿里oss上传功能的实例(一)
Aug 09 Javascript
webpack 打包压缩js和css的方法示例
Mar 20 Javascript
vuejs+element UI点击编辑表格某一行时获取内容填入表单的示例
Oct 31 Javascript
如何利用javascript接收json信息并进行处理
Aug 06 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
php中通过正则表达式下载内容中的远程图片的函数代码
2012/01/10 PHP
PHP不用第三变量交换2个变量的值的解决方法
2013/06/02 PHP
php 遍历目录,生成目录下每个文件的md5值并写入到结果文件中
2016/12/12 PHP
javascript显示选择目录对话框的代码
2008/11/10 Javascript
jQuery 技巧小结
2010/04/02 Javascript
Jquery插件之多图片异步上传
2010/10/20 Javascript
jquery实现的让超出显示范围外的导航自动固定屏幕最顶上
2011/09/22 Javascript
图片上传判断及预览脚本的效果实例
2013/08/07 Javascript
jquery获取元素索引值index()示例
2014/02/13 Javascript
javascript将相对路径转绝对路径示例
2014/03/14 Javascript
使用JS取得焦点(focus)元素代码
2014/03/22 Javascript
JS字符串拼接在ie中都报错的解决方法
2014/03/27 Javascript
jquery使用remove()方法删除指定class子元素
2015/03/26 Javascript
webpack配置之后端渲染详解
2017/10/26 Javascript
原生javascript实现连连看游戏
2019/01/03 Javascript
微信小程序如何实现五星评价功能
2019/10/15 Javascript
vue 解决文本框被键盘遮住的问题
2019/11/06 Javascript
Vue学习之组件用法实例详解
2020/01/06 Javascript
node.js使用net模块创建服务器和客户端示例【基于TCP协议】
2020/02/14 Javascript
[02:48]DOTA2超级联赛专访海涛:你们的选择没有错
2013/06/07 DOTA
Python爬虫之模拟知乎登录的方法教程
2017/05/25 Python
Flask实现图片的上传、下载及展示示例代码
2018/08/03 Python
Python连接Redis的基本配置方法
2018/09/13 Python
python对于requests的封装方法详解
2019/01/03 Python
Python3.4学习笔记之 idle 清屏扩展插件用法分析
2019/03/01 Python
Django ORM 查询管理器源码解析
2019/08/05 Python
Pytorch 实现自定义参数层的例子
2019/08/17 Python
Python3.6 中的pyinstaller安装和使用教程
2020/03/16 Python
Python中的特殊方法以及应用详解
2020/09/20 Python
HTML5 Canvas中使用路径描画二阶、三阶贝塞尔曲线
2015/01/01 HTML / CSS
纽约服装和生活方式品牌:Saturdays NYC
2017/08/13 全球购物
美国首屈一指的礼品篮供应商:GiftTree
2018/01/06 全球购物
软件项目开发计划书
2014/05/01 职场文书
小学生保护环境倡议书
2014/05/15 职场文书
违纪学生保证书
2015/02/27 职场文书
使用Nginx搭载rtmp直播服务器的方法
2021/10/16 Servers