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中的parseInt使用技巧
Sep 03 Javascript
关于jQuery参考实例 1.0 jQuery的哲学
Apr 07 Javascript
使用javascript实现页面定时跳转总结篇
Sep 21 Javascript
javascript cookie的简单应用
Feb 24 Javascript
根据输入邮箱号跳转到相应登录地址的解决方法
Dec 13 Javascript
一个炫酷的Bootstrap导航菜单
Dec 28 Javascript
十大 Node.js 的 Web 框架(快速提升工作效率)
Jun 30 Javascript
Angular 2父子组件数据传递之@Input和@Output详解 (上)
Jul 05 Javascript
vue 2.0 购物车小球抛物线的示例代码
Feb 01 Javascript
解决vue请求接口第一次成功,第二次失败问题
Sep 08 Javascript
Ant-design-vue Table组件customRow属性的使用说明
Oct 28 Javascript
Vue 防止短时间内连续点击后多次触发请求的操作
Nov 11 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
深入for,while,foreach遍历时间比较的详解
2013/06/08 PHP
py文件转exe时包含paramiko模块出错解决方法
2016/08/12 PHP
laravel-admin 后台表格筛选设置默认的查询日期方法
2019/10/03 PHP
PHP常量及变量区别原理详解
2020/08/14 PHP
PHP反射基础知识回顾
2020/09/10 PHP
js 方法实现返回多个数据的代码
2009/04/30 Javascript
基于jquery的自定义鼠标提示效果 jquery.toolTip
2010/11/14 Javascript
ajax更新数据后,jquery、jq失效问题
2011/03/16 Javascript
JavaScript原生对象之Number对象的属性和方法详解
2015/03/13 Javascript
Jquery attr()方法 属性赋值和属性获取详解
2016/04/15 Javascript
javascript中对象的定义、使用以及对象和原型链操作小结
2016/12/14 Javascript
微信小程序 UI与容器组件总结
2017/02/21 Javascript
Node.js中多进程模块Cluster的介绍与使用
2017/05/27 Javascript
vue $router和$route的区别详解
2020/12/02 Vue.js
[06:11]2014DOTA2国际邀请赛 专访团结一心的VG战队
2014/07/21 DOTA
Python对象体系深入分析
2014/10/28 Python
python实现将文本转换成语音的方法
2015/05/28 Python
python 递归遍历文件夹,并打印满足条件的文件路径实例
2017/08/30 Python
使用Python+Splinter自动刷新抢12306火车票
2018/01/03 Python
django表单实现下拉框的示例讲解
2018/05/29 Python
利用python提取wav文件的mfcc方法
2019/01/09 Python
Python collections中的双向队列deque简单介绍详解
2019/11/04 Python
Python爬虫爬取百度搜索内容代码实例
2020/06/05 Python
CSS3实现的闪烁跳跃进度条示例(附源码)
2013/08/19 HTML / CSS
详解Html5原生拖拽操作
2018/01/12 HTML / CSS
Casetify官网:自制专属手机壳、iPad护壳和Apple Watch手表带
2018/05/09 全球购物
简述你对Statement,PreparedStatement,CallableStatement的理解
2013/03/25 面试题
EJB发布WEB服务一般步骤
2012/10/31 面试题
中医临床专业自我鉴定范文
2014/01/15 职场文书
个人银行贷款担保书
2014/04/01 职场文书
绿色环保家庭事迹材料
2014/08/31 职场文书
优秀共产党员主要事迹材料
2015/11/05 职场文书
SQL Server2019数据库之简单子查询的具有方法
2021/04/27 SQL Server
使用SQL实现车流量的计算的示例代码
2022/02/28 SQL Server
Redis安装使用RedisJSON模块的方法
2022/03/23 Redis
Mysql中常用的join连接方式
2022/05/11 MySQL