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版Tab标签切换
Mar 16 Javascript
javaScript复制功能调用实现方案
Dec 13 Javascript
JS无限极树形菜单,json格式、数组格式通用示例
Jul 30 Javascript
AngularJS 实现弹性盒子布局的方法
Aug 30 Javascript
javascript汉字拼音互转的简单实例
Oct 09 Javascript
jquery实现输入框实时输入触发事件代码
Dec 21 Javascript
详解JavaScript中return的用法
May 08 Javascript
jQuery简单绑定单个事件的方法示例
Jun 10 jQuery
浅谈VUE监听窗口变化事件的问题
Feb 24 Javascript
vuedraggable+element ui实现页面控件拖拽排序效果
Jul 29 Javascript
Node.js + express基本用法教程
Mar 14 Javascript
ES6的异步操作之promise用法和async函数的具体使用
Dec 06 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发送HTTP请求的几种方式
2017/07/25 PHP
JavaScript 对象模型 执行模型
2009/12/06 Javascript
Jquery chosen动态设置值实例介绍
2013/08/08 Javascript
js实现可拖动DIV的方法
2013/12/17 Javascript
兼容主流浏览器的iframe自适应高度js脚本
2014/01/10 Javascript
js打开新窗口方法整理
2014/02/17 Javascript
浅谈Unicode与JavaScript的发展史
2015/01/19 Javascript
JavaScript中property和attribute的区别详细介绍
2015/03/03 Javascript
jQuery实现的个性化返回底部与返回顶部特效代码
2015/10/30 Javascript
点评js异步加载的4种方式
2015/12/22 Javascript
indexedDB bootstrap angularjs之 MVC DOMO (应用示例)
2016/06/20 Javascript
JavaScript 监控微信浏览器且自带返回按钮时间
2016/11/27 Javascript
C#微信小程序服务端获取用户解密信息实例代码
2017/03/10 Javascript
yii form 表单提交之前JS在提交按钮的验证方法
2017/03/15 Javascript
vue实现全选、反选功能
2020/11/17 Javascript
nodejs 子进程正确的打开方式
2017/07/03 NodeJs
利用types增强vscode中js代码提示功能详解
2017/07/07 Javascript
JQuery EasyUI的一些常用组件
2017/07/12 jQuery
详解升级react-router 4 踩坑指南
2017/08/14 Javascript
VueCli3.0中集成MockApi的方法示例
2019/07/05 Javascript
基于vue hash模式微信分享#号的解决
2020/09/07 Javascript
基于Vant UI框架实现时间段选择器
2020/12/24 Javascript
[08:54]DOTA2-DPC中国联赛 正赛 Aster vs LBZS 选手采访
2021/03/11 DOTA
在win和Linux系统中python命令行运行的不同
2016/07/03 Python
python字典DICT类型合并详解
2017/08/17 Python
MySQL适配器PyMySQL详解
2017/09/20 Python
python实现杨辉三角的几种方法代码实例
2021/03/02 Python
HTML5中indexedDB 数据库的使用实例
2017/05/11 HTML / CSS
Tostadora意大利:定制T恤
2019/04/08 全球购物
一份全面的PHP面试问题考卷
2012/07/15 面试题
企业演讲稿范文大全
2014/05/20 职场文书
班训口号大全
2014/06/18 职场文书
幼儿园户外活动总结
2014/07/04 职场文书
检讨书格式
2015/01/23 职场文书
如何开启Apache,Nginx和IIS服务器的GZIP压缩功能
2022/04/29 Servers
MyBatis XPathParser解析器使用范例详解
2022/07/15 Java/Android