Vue实现双向数据绑定


Posted in Javascript onMay 03, 2017

Vue实现双向数据绑定的方式,具体内容如下

Vue是如何实现双向数据绑定的呢?答案是前端数据劫持。其通过Object.defineProperty()方法,这个方法可以设置getter和setter函数,在setter函数中,就可以监听到数据的变化,从而更新绑定的元素的值。

实现对象属性变化绑定到UI

大概的思路是:

1. 确定绑定的数据,使用Object.defineProperty()对其数据变化进行监听(对应defineGetAndSet)
2. 一旦数据发生改动,会触发setter函数。因此在setter函数内要调用回调函数触发绑定元素的更新。
3. 绑定元素的更新就是遍历所有的绑定元素,通过绑定属性的值确定函数的调用,并传入修改后的值。(对应scan)

实现UI变化绑定到对象属性

这个就比较简单了,因为UI的改变会触发一些事件,比如keyup。通过监听事件来实现数据的改变。而上面说了,数据的改变又会导致绑定其值的元素的UI改变。

实现

var data = {
 value: 'hello world!'
}
var bindValue;
//确定绑定的元素
var bindelems = [document.getElementById('p'), document.getElementById('input')];
//修改绑定元素的值的方法
var command = {
 text: function(str) {
 this.innerHTML = str;
 },
 value: function(str) {
 this.value = str;
 }
};
//遍历绑定元素修改其值
var scan = function() {
 console.log('in scan');
 for(var i = 0; i < bindelems.length; i++) {
 var elem = bindelems[i];
 console.log('elem',elem);
 for(var j = 0; j < elem.attributes.length; j++) {
 var attr = elem.attributes[j];
 if(attr.nodeName.indexOf('q-')>=0) {
 command[attr.nodeName.slice(2)].call(elem, data[attr.nodeValue]);
 }
 }
 }
}
//设置劫持
var defineGetAndSet = function(obj, propname) {
 Object.defineProperty(obj, propname, {
 get: function() {
 return bindValue;
 },
 set: function(value){
 bindValue = value;
 scan();
 },
 enumerable: true,
 configurable: true
 })
} 
//一开始先初始化,使所有绑定的元素值为初始值
scan();
//设置需要被劫持的元素
defineGetAndSet(data, 'value');
//监听UI变化
bindelems[1].addEventListener('keyup', function(e) {
 data.value = e.target.value;
});
setTimeout(function() {
 data.value = 'change';
}, 1000);

参考:

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

Javascript 相关文章推荐
jQuery UI 应用不同Theme的办法
Sep 12 Javascript
Bootstrap导航栏各元素操作方法(表单、按钮、文本)
Dec 28 Javascript
WordPress中利用AJAX技术进行评论提交的实现示例
Jan 12 Javascript
jQuery实现鼠标选中文字后弹出提示窗口效果【附demo源码】
Sep 05 Javascript
概述BootStrap中role=&quot;form&quot;及role作用角色
Dec 08 Javascript
bootstrap是什么_动力节点Java学院整理
Jul 14 Javascript
限时抢购-倒计时的完整实例(分享)
Sep 17 Javascript
JS中Map和ForEach的区别
Feb 05 Javascript
微信小程序wx:for和wx:for-item的用法详解
Apr 01 Javascript
微信小程序与公众号实现数据互通的方法
Jul 25 Javascript
在项目vue中使用echarts的操作步骤
Sep 07 Javascript
JavaScript获取时区实现过程解析
Sep 24 Javascript
Angular 4.x 路由快速入门学习
May 03 #Javascript
javaScript 逻辑运算符使用技巧整理
May 03 #Javascript
浅谈Node.js轻量级Web框架Express4.x使用指南
May 03 #Javascript
vue的Virtual Dom实现snabbdom解密
May 03 #Javascript
JavaScript中undefined和null的区别
May 03 #Javascript
Node.js对MongoDB数据库实现模糊查询的方法
May 03 #Javascript
xmlplus组件设计系列之文本框(TextBox)(3)
May 03 #Javascript
You might like
漫荒推荐:画风超赞的国风漫画推荐 超长假期不无聊
2020/03/08 国漫
山进SANGEAN ATS-909X电路分析
2021/03/02 无线电
php实现统计目录文件大小的函数
2015/12/25 PHP
PHP Imagick完美实现图片裁切、生成缩略图、添加水印
2016/02/22 PHP
浅析Yii2缓存的使用
2016/05/10 PHP
php删除数组指定元素实现代码
2017/05/03 PHP
利用php-cli和任务计划实现订单同步功能的方法
2017/05/03 PHP
thinkphp框架无限级栏目的排序功能实现方法示例
2020/03/29 PHP
解决js正则匹配换行问题实现代码
2012/12/10 Javascript
如何使用jQUery获取选中radio对应的值(一句代码)
2013/06/03 Javascript
js的匿名函数使用介绍
2013/12/11 Javascript
js、jquery图片动画、动态切换示例代码
2014/06/03 Javascript
javascript基本类型详解
2014/11/28 Javascript
举例讲解jQuery中可见性过滤选择器的使用
2016/04/18 Javascript
node.JS md5加密中文与php结果不一致的解决方法
2017/05/05 Javascript
微信小程序使用request网络请求操作实例
2017/12/15 Javascript
微信小程序自定义对话框弹出和隐藏动画
2018/07/19 Javascript
JS数组扁平化(flat)方法总结详解
2019/06/24 Javascript
解决vue-router 二级导航默认选中某一选项的问题
2019/11/01 Javascript
原生js实现购物车功能
2020/09/23 Javascript
[02:19]2014DOTA2国际邀请赛 专访820少年们一起去追梦吧
2014/07/14 DOTA
[34:08]2018DOTA2亚洲邀请赛3月29日 小组赛B组 VP VS EG
2018/03/30 DOTA
解决python中遇到字典里key值为None的情况,取不出来的问题
2018/10/17 Python
python 利用for循环 保存多个图像或者文件的实例
2018/11/09 Python
python 读取Linux服务器上的文件方法
2018/12/27 Python
Python的条件锁与事件共享详解
2019/09/12 Python
解决Pytorch 加载训练好的模型 遇到的error问题
2020/01/10 Python
python使用numpy中的size()函数实例用法详解
2021/01/29 Python
加拿大票务网站:Ticketmaster加拿大
2017/07/17 全球购物
Parfume Klik丹麦:香水网上商店
2018/07/10 全球购物
在SQL Server中创建数据库主要有那种方式
2013/09/10 面试题
Servlet方面面试题
2016/09/28 面试题
党的群众路线教育实践活动查摆剖析材料
2014/10/10 职场文书
整改通知书
2015/04/20 职场文书
百家讲坛观后感
2015/06/12 职场文书
Windows Server 2016服务器用户管理及远程授权图文教程
2022/08/14 Servers