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 相关文章推荐
css样式标签和js语法属性区别
Nov 06 Javascript
js获取滚动距离的方法
May 30 Javascript
jQuery实现图片轮播特效代码分享
Sep 15 Javascript
Jquery1.9.1源码分析系列(六)延时对象应用之jQuery.ready
Nov 24 Javascript
jquery获取form表单input元素值的简单实例
May 30 Javascript
JavaScript实现前端分页控件
Apr 19 Javascript
jquery的$().each和$.each的区别
Jan 18 jQuery
vue2之简易的pc端短信验证码的问题及处理方法
Jun 03 Javascript
js实现无缝滚动双图切换效果
Jul 09 Javascript
详解JavaScript 浮点数运算的精度问题
Jul 23 Javascript
Vue.js项目实战之多语种网站的功能实现(租车)
Aug 07 Javascript
CountUp.js数字滚动插件使用方法详解
Oct 17 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相关资料
2006/10/09 PHP
PHP数组内存耗用太多问题的解决方法
2010/04/05 PHP
php 生成唯一id的几种解决方法
2013/03/08 PHP
php判断对象是派生自哪个类的方法
2015/06/20 PHP
PHP实现数组array转换成xml的方法
2016/07/19 PHP
php实现将数据做成json的格式给前端使用
2018/08/21 PHP
Thinkphp 框架扩展之Widget扩展实现方法分析
2020/04/23 PHP
Jquery操作Select 简单方便 一个js插件搞定
2009/11/12 Javascript
JavaScript 面向对象之命名空间
2010/05/04 Javascript
基于jQuery的message插件实现右下角弹出消息框
2011/01/11 Javascript
JavaScript关闭当前页面(窗口)不带任何提示
2014/03/26 Javascript
jQuery 1.9.1源码分析系列(十五)之动画处理
2015/12/03 Javascript
javascript 注释代码的几种方法总结
2017/01/04 Javascript
详谈DOM简介及节点、属性、查找节点的方法
2017/11/16 Javascript
Cocos2d实现刮刮卡效果
2018/12/20 Javascript
JavaScript惰性求值的一种实现方法示例
2019/01/11 Javascript
vue实现户籍管理系统
2020/05/29 Javascript
Angular+ionic实现折叠展开效果的示例代码
2020/07/29 Javascript
如何在vue 中使用柱状图 并自修改配置
2021/01/21 Vue.js
Python pyinotify日志监控系统处理日志的方法
2018/03/08 Python
python按行读取文件,去掉每行的换行符\n的实例
2018/04/19 Python
python 读取目录下csv文件并绘制曲线v111的方法
2018/07/06 Python
代码总结Python2 和 Python3 字符串的区别
2020/01/28 Python
搭建pypi私有仓库实现过程详解
2020/11/25 Python
python 实现逻辑回归
2020/12/30 Python
基于Html5实现的react拖拽排序组件示例
2018/08/13 HTML / CSS
通过canvas转换颜色为RGBA格式及性能问题的解决
2019/11/22 HTML / CSS
HTML5 Canvas实现放大镜效果示例
2020/03/25 HTML / CSS
新锐科技Java程序员面试题
2016/07/25 面试题
简单而又朴实的个人求职信分享
2013/12/12 职场文书
送餐员岗位职责范本
2014/02/21 职场文书
教育英语专业毕业生的求职信
2014/03/13 职场文书
党员评议思想汇报
2014/10/08 职场文书
好人好事新闻稿
2015/07/17 职场文书
建立共青团委员会的请示
2019/04/02 职场文书
人生感悟经典句子
2019/08/20 职场文书