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 相关文章推荐
js刷新框架子页面的七种方法代码
Nov 20 Javascript
jquery显示和隐藏div特效实例
Feb 27 Javascript
JQuery获取样式中的background-color颜色值的问题
Aug 20 Javascript
Python脚本后台运行的几种方式
Mar 09 Javascript
js实现新浪微博首页效果
Oct 16 Javascript
JavaScript学习笔记之检测客户端类型是(引擎、浏览器、平台、操作系统、移动设备)
Dec 03 Javascript
js倒计时简单实现方法
Dec 17 Javascript
深入理解Angular中的依赖注入
Jun 26 Javascript
javascript少儿编程关于返回值的函数内容
May 27 Javascript
原生JS实现旋转轮播图+文字内容切换效果【附源码】
Sep 29 Javascript
jQuery实现input[type=file]多图预览上传删除等功能
Aug 02 jQuery
three.js 利用uv和ThreeBSP制作一个快递柜功能
Aug 18 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
咖啡的种类和口感
2021/03/03 新手入门
别人整理的服务器变量:$_SERVER
2006/10/20 PHP
MySQL GBK→UTF-8编码转换
2007/05/24 PHP
通过PHP修改Linux或Unix口令的方法分享
2012/01/30 PHP
ubutu 16.04环境下,PHP与mysql数据库,网页登录验证实例讲解
2017/07/20 PHP
php实现每日签到功能
2018/11/29 PHP
js用图作提交按钮或超连接
2008/03/26 Javascript
一段利用WSH获取登录时间的jscript代码
2008/05/11 Javascript
javascript数组的扩展实现代码集合
2008/06/01 Javascript
JavaScript 组件之旅(二)编码实现和算法
2009/10/28 Javascript
使用js获取地址栏中传递的值
2013/07/02 Javascript
jQuery实现简单滚动动画效果
2016/04/07 Javascript
AngularJS基础 ng-options 指令详解
2016/08/02 Javascript
javascript宿主对象之window.navigator详解
2016/09/07 Javascript
使用 Vue.js 仿百度搜索框的实例代码
2017/05/09 Javascript
angular动态删除ng-repaeat添加的dom节点的方法
2017/07/20 Javascript
bootstrap paginator分页插件的两种使用方式实例详解
2017/11/14 Javascript
Vue封装的可编辑表格插件方法
2018/08/28 Javascript
微信小程序自定义导航栏实例代码
2019/04/05 Javascript
微信小程序实现录音时的麦克风动画效果实例
2019/05/18 Javascript
详解vuex数据传输的两种方式及this.$store undefined的解决办法
2019/08/26 Javascript
浅谈微信小程序列表埋点曝光指南
2019/10/15 Javascript
解决vue项目axios每次请求session不一致的问题
2020/10/24 Javascript
原生JS实现京东查看商品点击放大
2020/12/21 Javascript
Python实现简单http服务器
2018/04/12 Python
Python读取txt内容写入xls格式excel中的方法
2018/10/11 Python
Python 中的参数传递、返回值、浅拷贝、深拷贝
2019/06/25 Python
css3设置box-pack和box-align让div里面的元素垂直居中
2014/09/01 HTML / CSS
一款利用纯css3实现的360度翻转按钮的实例教程
2014/11/05 HTML / CSS
HTML5新标签兼容——&gt; 的两种方法
2018/09/12 HTML / CSS
详解HTML5常用的语义化标签
2019/09/27 HTML / CSS
红头文件任命书范本
2014/06/05 职场文书
2014年财政所工作总结
2014/11/22 职场文书
2015年中职班主任工作总结
2015/05/25 职场文书
信仰纪录片观后感
2015/06/08 职场文书
js Proxy的原理详解
2021/05/25 Javascript