vue双向数据绑定原理探究(附demo)
发布时间 - 2026-01-10 22:35:11 点击率:次昨天被导师叫去研究了一下vue的双向数据绑定原理。。。本来以为原理的东西都非常高深,没想到vue的双向绑定真的很好理解啊。。。自己动手写了一个。

传送门
双向绑定的思想
双向数据绑定的思想就是数据层与UI层的同步,数据再两者之间的任一者发生变化时都会同步更新到另一者。
双向绑定的一些方法
目前,前端实现数据双向数据绑定的方法大致有以下三种:
1.发布者-订阅者模式(backbone.js)
思路:使用自定义的data属性在HTML代码中指明绑定。所有绑定起来的JavaScript对象以及DOM元素都将“订阅”一个发布者对象。任何时候如果JavaScript对象或者一个HTML输入字段被侦测到发生了变化,我们将代理事件到发布者-订阅者模式,这会反过来将变化广播并传播到所有绑定的对象和元素。
2.赃值检测(angular.js)
思路:通过轮询的方式检测数据变动。才特定的事件触发时进入赃值检测。
大致如下:
• DOM事件,譬如用户输入文本,点击按钮等。( ng-click )
• XHR响应事件 ( $http )
• 浏览器Location变更事件 ( $location )
• Timer事件( $timeout , $interval )
• 执行 $digest() 或 $apply()
3.数据劫持(vue.js)
思路:使用Object.defineProperty对数据对象做属性get和set的监听,当有数据读取和赋值操作时则调用节点的指令,这样使用最通用的=等号赋值就可以触发了。
wue双向数据绑定小demo思路
① 构造一个Wue对象,定义该对象的属性el、data,创建对象的时候传相应数据,并执行init()方法。
var Wue=function(params){
this.el=document.querySelector(params.el);
this.data=params.data;
this.init();
};
② Init方法中执行bindText和bindModel方法,这两个方法分别是解析dom中绑定了w-model、w-text指令的html,并作相应处理。
init:function(){
this.bindText();
this.bindModel();
}
③ bindText方法,把带有w-text指令的元素放进一个数组中,如:w-text='demo',然后令其innerHTML的值等于传进来的data[demo]。
bindText:function(){
var textDOMs=this.el.querySelectorAll('[w-text]'),
bindText;
for(var i=0;i<textDOMs.length;i++){
bindText=textDOMs[i].getAttribute('w-text');
textDOMs[i].innerHTML=this.data[bindText];
}
}
④ bindModel方法,把带有w-model指令的元素(一般为form相关元素)放进一个数组中,如:w-model='demo',为每一个元素绑定keyup事件(兼容浏览器写法)。
bindModel:function(){
var modelDOMs=this.el.querySelectorAll('[w-model]'),
bindModel;
var _that=this;
for(var i=0;i<modelDOMs.length;i++){
bindModel=modelDOMs[i].getAttribute('w-model');
modelDOMs[i].value=this.data[bindModel]||'';
//数据劫持
this.defineObj(this.data,bindModel);
if(document.addEventListener){
modelDOMs[i].addEventListener('keyup',function(event) {
console.log('test');
e=event||window.event;
_that.data[bindModel]=e.target.value;
},false);
}else{
modelDOMs[i].attachEvent('onkeyup',function(event){
e=event||window.event;
_that.data[bindModel]=e.target.value;
},false);
}
}
}
⑤ 使用Object.defineProperty,定义set和get方法,并在set方法中调用bindText方法。这是利用了一旦w-model的值在input中被改变,会自动执行set方法,所以只有在这个方法中调用更新w-text的方法即可。
defineObj:function(obj,prop,value){
var val=value||'';
var _that=this;
try{
Object.defineProperty(obj,prop,{
get:function(){
return val;
},
set:function(newVal){
val=newVal;
_that.bindText();
}
})
}catch (err){
console.log('Browser not support!')
}
}
⑥使用
html:<br><h3>双向数据绑定demo</h3>
<div id="wrap">
<input type="text" w-model='demo'>
<h5 w-text='demo'></h5>
</div><br>js:
<script src='../js/wue.js'></script>
<script>
new Wue({
el:'#wrap',
data:{
demo:'winty'
}
})
</script>
完整demo下载:https://github.com/LuckyWinty/two-way-data
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!
# vue
# 双向数据绑定
# 双向绑定
# Vue数据双向绑定原理实例解析
# Vue的双向数据绑定实现原理解析
# 浅谈vue中数据双向绑定的实现原理
# 详解Vue双向数据绑定原理解析
# 深入了解Vue中双向数据绑定原理
# 绑定
# 组中
# 这是
# 在这个
# 并在
# 真的很
# 这两个
# 三种
# 写了
# 自定义
# 都将
# 定了
# 这会
# 自己动手
# 并作
# 就可以
# 令其
# 时则
# 同步更新
# 发生了
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何创建自定义中间件?(Middleware代码示例)
javascript基本数据类型及类型检测常用方法小结
如何基于云服务器快速搭建网站及云盘系统?
Laravel如何获取当前用户信息_Laravel Auth门面获取用户ID
免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?
b2c电商网站制作流程,b2c水平综合的电商平台?
黑客如何利用漏洞与弱口令入侵网站服务器?
iOS正则表达式验证手机号、邮箱、身份证号等
如何在Windows 2008云服务器安全搭建网站?
Laravel模型事件有哪些_Laravel Model Event生命周期详解
如何在Windows虚拟主机上快速搭建网站?
制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?
Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南
作用域操作符会触发自动加载吗_php类自动加载机制与::调用【教程】
如何将凡科建站内容保存为本地文件?
在线教育网站制作平台,山西立德教育官网?
Laravel如何处理CORS跨域问题_Laravel项目CORS配置与解决方案
Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程
Laravel如何升级到最新版本?(升级指南和步骤)
Windows10电脑怎么查看硬盘通电时间_Win10使用工具检测磁盘健康
Python文件流缓冲机制_IO性能解析【教程】
javascript中数组(Array)对象和字符串(String)对象的常用方法总结
做企业网站制作流程,企业网站制作基本流程有哪些?
微信小程序 scroll-view组件实现列表页实例代码
如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)
桂林网站制作公司有哪些,桂林马拉松怎么报名?
JavaScript如何实现音频处理_Web Audio API如何工作?
悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤
Laravel如何与Pusher实现实时通信?(WebSocket示例)
Laravel如何使用Gate和Policy进行授权?(权限控制)
如何在沈阳梯子盘古建站优化SEO排名与功能模块?
node.js报错:Cannot find module 'ejs'的解决办法
如何用wdcp快速搭建高效网站?
Laravel Facade的原理是什么_深入理解Laravel门面及其工作机制
Laravel Eloquent关联是什么_Laravel模型一对一与一对多关系精讲
香港服务器租用费用高吗?如何避免常见误区?
php485函数参数是什么意思_php485各参数详细说明【介绍】
实现点击下箭头变上箭头来回切换的两种方法【推荐】
如何用y主机助手快速搭建网站?
Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制
Zeus浏览器网页版官网入口 宙斯浏览器官网在线通道
北京企业网站设计制作公司,北京铁路集团官方网站?
网站制作企业,网站的banner和导航栏是指什么?
Swift中switch语句区间和元组模式匹配
canvas 画布在主流浏览器中的尺寸限制详细介绍
javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】
大连 网站制作,大连天途有线官网?
Linux网络带宽限制_tc配置实践解析【教程】
Win11怎么设置默认图片查看器_Windows11照片应用关联设置
JavaScript模板引擎Template.js使用详解
上一篇: 鸟姐制作小网站视频,snh48鸟姐是谁?
下一篇:德邦快递2019春节放假安排
上一篇: 鸟姐制作小网站视频,snh48鸟姐是谁?
下一篇:德邦快递2019春节放假安排

