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为元素绑定事件
Apr 27 Javascript
JavaScript图片轮播代码分享
Jul 31 Javascript
jquery简单实现网页层的展开与收缩效果
Aug 07 Javascript
IE和Firefox之间在JavaScript语法上的差异
Apr 22 Javascript
Node.js中使用jQuery的做法
Aug 17 Javascript
利用node.js+mongodb如何搭建一个简单登录注册的功能详解
Jul 30 Javascript
element ui里dialog关闭后清除验证条件方法
Feb 26 Javascript
JavaScript中arguments和this对象用法分析
Aug 08 Javascript
ES6基础之默认参数值
Feb 21 Javascript
探索JavaScript中私有成员的相关知识
Jun 13 Javascript
原生javascript制作的拼图游戏实现方法详解
Feb 23 Javascript
请求时token过期自动刷新token操作
Sep 11 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
php中jpgraph类库的使用介绍
2013/08/08 PHP
PHP简单的MVC框架实现方法
2015/12/01 PHP
Yii2创建控制器(createController)方法详解
2016/07/23 PHP
基于jquery的无缝循环新闻列表插件
2011/03/07 Javascript
基于jquery ajax 用户无刷新登录方法详解
2012/04/28 Javascript
使用JavaScript动态设置样式实现代码及演示动画
2013/01/25 Javascript
JS中Iframe之间传值的方法
2013/03/11 Javascript
jQuery.fn和jQuery.prototype区别介绍
2013/10/05 Javascript
Ajax同步与异步传输的示例代码
2013/11/21 Javascript
使用jquery选择器如何获取父级元素、同级元素、子元素
2014/05/14 Javascript
javascript中定义类的方法汇总
2014/12/28 Javascript
jQuery中常用动画效果函数(日常整理)
2016/09/17 Javascript
微信小程序 setData的使用方法详解
2017/04/20 Javascript
深入理解vue中的$set
2017/06/01 Javascript
es7学习教程之Decorators(修饰器)详解
2017/07/21 Javascript
Vue中的无限加载vue-infinite-loading的方法
2018/04/08 Javascript
详解Angular模板引用变量及其作用域
2018/11/23 Javascript
Angular8 实现table表格表头固定效果
2020/01/03 Javascript
vue 解决setTimeOut和setInterval函数无效报错的问题
2020/07/30 Javascript
详解Python中__str__和__repr__方法的区别
2015/04/17 Python
Python Socket编程详细介绍
2017/03/23 Python
VSCode下好用的Python插件及配置
2018/04/06 Python
Python格式化字符串f-string概览(小结)
2019/06/18 Python
Python基于callable函数检测对象是否可被调用
2020/10/16 Python
Python读取ini配置文件传参的简单示例
2021/01/05 Python
德国家用电器购物网站:Premiumshop24
2019/08/22 全球购物
护士个人简历自荐信
2013/10/18 职场文书
房地产销售员的自我评价分享
2013/12/04 职场文书
大学四年的个人自我评价
2014/01/14 职场文书
敬老文明号事迹材料
2014/01/16 职场文书
绘画专业自荐信范文
2014/02/23 职场文书
《在家里》教后反思
2014/03/01 职场文书
保证书格式范文
2014/04/28 职场文书
健康家庭事迹材料
2014/05/02 职场文书
详细介绍python类及类的用法
2021/05/31 Python
linux目录管理方法介绍
2022/06/01 Servers