全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

vue双向数据绑定原理探究(附demo)

昨天被导师叫去研究了一下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中双向数据绑定原理  # 绑定  # 组中  # 这是  # 在这个  # 并在  # 真的很  # 这两个  # 三种  # 写了  # 自定义  # 都将  # 定了  # 这会  # 自己动手  # 并作  # 就可以  # 令其  # 时则  # 同步更新  # 发生了 


相关文章: 建站之星安装模板失败:服务器环境不兼容?  建站与域名管理如何高效结合?  大学网站设计制作软件有哪些,如何将网站制作成自己app?  建站之星如何快速更换网站模板?  如何在Golang中引入测试模块_Golang测试包导入与使用实践  岳西云建站教程与模板下载_一站式快速建站系统操作指南  云南网站制作公司有哪些,云南最好的招聘网站是哪个?  如何选择香港主机高效搭建外贸独立站?  建站之星免费模板:自助建站系统与智能响应式一键生成  成都网站制作价格表,现在成都广电的单独网络宽带有多少的,资费是什么情况呢?  如何通过FTP服务器快速搭建网站?  青岛网站建设如何选择本地服务器?  b2c电商网站制作流程,b2c水平综合的电商平台?  如何配置FTP站点权限与安全设置?  网站制作模板下载什么软件,ppt模板免费下载网站?  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  西安专业网站制作公司有哪些,陕西省建行官方网站?  C++用Dijkstra(迪杰斯特拉)算法求最短路径  魔毅自助建站系统:模板定制与SEO优化一键生成指南  如何在橙子建站上传落地页?操作指南详解  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  如何选择高效响应式自助建站源码系统?  如何自定义建站之星模板颜色并下载新样式?  建站之星CMS建站配置指南:模板选择与SEO优化技巧  网页设计与网站制作内容,怎样注册网站?  如何在建站之星绑定自定义域名?  网站制作费用多少钱,一个网站的运营,需要哪些费用?  香港服务器网站生成指南:免费资源整合与高速稳定配置方案  IOS倒计时设置UIButton标题title的抖动问题  孙琪峥织梦建站教程如何优化数据库安全?  如何通过服务器快速搭建网站?完整步骤解析  如何用低价快速搭建高质量网站?  如何配置WinSCP新建站点的密钥验证步骤?  建站之星多图banner生成与模板自定义指南  如何在局域网内绑定自建网站域名?  如何选择CMS系统实现快速建站与SEO优化?  建站之星客服服务时间及联系方式如何?  ,sp开头的版面叫什么?  网站制作专业公司有哪些,如何制作一个企业网站,建设网站的基本步骤有哪些?  建站主机选哪家性价比最高?  临沂网站制作企业,临沂第三中学官方网站?  北京专业网站制作设计师招聘,北京白云观官方网站?  代刷网站制作软件,别人代刷火车票靠谱吗?  制作网站的软件下载免费,今日头条开宝箱老是需要下载怎么回事?  制作网站的基本流程,设计网站的软件是什么?  相册网站制作软件,图片上的网址怎么复制?  如何通过IIS搭建网站并配置访问权限?  沈阳个人网站制作公司,哪个网站能考到沈阳事业编招聘的信息?  c# await 一个已经完成的Task会发生什么  ppt制作免费网站有哪些,ppt模板免费下载网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。