最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue雙向數(shù)據(jù)綁定原理探究(附demo)

 更新時(shí)間:2017年01月17日 14:21:42   作者:小蚊  
本文主要介紹了vue雙向數(shù)據(jù)綁定的原理,文章結(jié)尾附上完整demo下載。具有一定的參考價(jià)值,下面跟著小編一起來看下吧

昨天被導(dǎo)師叫去研究了一下vue的雙向數(shù)據(jù)綁定原理。。。本來以為原理的東西都非常高深,沒想到vue的雙向綁定真的很好理解啊。。。自己動(dòng)手寫了一個(gè)。

傳送門

雙向綁定的思想

雙向數(shù)據(jù)綁定的思想就是數(shù)據(jù)層與UI層的同步,數(shù)據(jù)再兩者之間的任一者發(fā)生變化時(shí)都會(huì)同步更新到另一者。

雙向綁定的一些方法

目前,前端實(shí)現(xiàn)數(shù)據(jù)雙向數(shù)據(jù)綁定的方法大致有以下三種:

1.發(fā)布者-訂閱者模式(backbone.js)

思路:使用自定義的data屬性在HTML代碼中指明綁定。所有綁定起來的JavaScript對(duì)象以及DOM元素都將“訂閱”一個(gè)發(fā)布者對(duì)象。任何時(shí)候如果JavaScript對(duì)象或者一個(gè)HTML輸入字段被偵測到發(fā)生了變化,我們將代理事件到發(fā)布者-訂閱者模式,這會(huì)反過來將變化廣播并傳播到所有綁定的對(duì)象和元素。

2.贓值檢測(angular.js)

思路:通過輪詢的方式檢測數(shù)據(jù)變動(dòng)。才特定的事件觸發(fā)時(shí)進(jìn)入贓值檢測。

大致如下:

•   DOM事件,譬如用戶輸入文本,點(diǎn)擊按鈕等。( ng-click )

•   XHR響應(yīng)事件 ( $http )

•   瀏覽器Location變更事件 ( $location )

•   Timer事件( $timeout , $interval )

•   執(zhí)行 $digest() 或 $apply()

3.數(shù)據(jù)劫持(vue.js)

思路:使用Object.defineProperty對(duì)數(shù)據(jù)對(duì)象做屬性get和set的監(jiān)聽,當(dāng)有數(shù)據(jù)讀取和賦值操作時(shí)則調(diào)用節(jié)點(diǎn)的指令,這樣使用最通用的=等號(hào)賦值就可以觸發(fā)了。

wue雙向數(shù)據(jù)綁定小demo思路

①  構(gòu)造一個(gè)Wue對(duì)象,定義該對(duì)象的屬性el、data,創(chuàng)建對(duì)象的時(shí)候傳相應(yīng)數(shù)據(jù),并執(zhí)行init()方法。

var Wue=function(params){
 this.el=document.querySelector(params.el);
 this.data=params.data;
 this.init();
};

②  Init方法中執(zhí)行bindText和bindModel方法,這兩個(gè)方法分別是解析dom中綁定了w-model、w-text指令的html,并作相應(yīng)處理。

init:function(){
  this.bindText();
  this.bindModel();
 }

③  bindText方法,把帶有w-text指令的元素放進(jìn)一個(gè)數(shù)組中,如:w-text='demo',然后令其innerHTML的值等于傳進(jìn)來的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相關(guān)元素)放進(jìn)一個(gè)數(shù)組中,如:w-model='demo',為每一個(gè)元素綁定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]||'';
 //數(shù)據(jù)劫持
 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方法中調(diào)用bindText方法。這是利用了一旦w-model的值在input中被改變,會(huì)自動(dòng)執(zhí)行set方法,所以只有在這個(gè)方法中調(diào)用更新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>雙向數(shù)據(jù)綁定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

以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時(shí)也希望多多支持腳本之家!

相關(guān)文章

  • 使用vue構(gòu)建一個(gè)上傳圖片表單

    使用vue構(gòu)建一個(gè)上傳圖片表單

    這篇文章主要為大家詳細(xì)介紹了使用vue構(gòu)建一個(gè)上傳圖片表單,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • vue項(xiàng)目中使用axios上傳圖片等文件操作

    vue項(xiàng)目中使用axios上傳圖片等文件操作

    axios 是一個(gè)基于Promise 用于瀏覽器和 nodejs 的 HTTP 客戶端。這篇文章主要給大家介紹了vue項(xiàng)目中使用axios上傳圖片等文件操作,需要的朋友參考下吧
    2017-11-11
  • vue-cli配置使用Vuex的全過程記錄

    vue-cli配置使用Vuex的全過程記錄

    這篇文章主要給大家介紹了關(guān)于vue-cli配置使用Vuex的相關(guān)資料,Vuex 是一個(gè)專為 Vue.js 應(yīng)用程序開發(fā)的狀態(tài)管理模式,本介紹的非常詳細(xì),需要的朋友可以參考下
    2021-07-07
  • vue中的render函數(shù)、h()函數(shù)、函數(shù)式組件詳解

    vue中的render函數(shù)、h()函數(shù)、函數(shù)式組件詳解

    在vue中我們使用模板HTML語法來組建頁面的,使用render函數(shù)我們可以用js語言來構(gòu)建DOM,這篇文章主要介紹了vue中的render函數(shù)、h()函數(shù)、函數(shù)式組件,需要的朋友可以參考下
    2023-02-02
  • 解決Vue的項(xiàng)目使用Element ui 走馬燈無法實(shí)現(xiàn)的問題

    解決Vue的項(xiàng)目使用Element ui 走馬燈無法實(shí)現(xiàn)的問題

    這篇文章主要介紹了解決Vue的項(xiàng)目使用Element ui 走馬燈無法實(shí)現(xiàn)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • 老生常談vue3組件通信方式

    老生常談vue3組件通信方式

    這篇文章主要介紹了vue3組件通信方式,面試題經(jīng)常會(huì)問到vue3組件間的通信方式,今天就通過實(shí)例代碼給大家詳細(xì)介紹下,對(duì)vue3組件通信相關(guān)知識(shí)感興趣的朋友一起看看吧
    2022-08-08
  • Vue實(shí)現(xiàn)過渡效果的基本方法

    Vue實(shí)現(xiàn)過渡效果的基本方法

    Vue 提供了一個(gè)強(qiáng)大的過渡系統(tǒng),可以用于在進(jìn)入、離開和列表渲染時(shí)添加各種動(dòng)畫效果,這些過渡不僅能夠提升用戶體驗(yàn),還能使界面更加生動(dòng)和吸引人,本文將介紹 Vue 中實(shí)現(xiàn)過渡效果的基本方法,并提供使用 setup 語法糖的代碼示例,需要的朋友可以參考下
    2024-09-09
  • vue+element導(dǎo)航欄高亮顯示的解決方式

    vue+element導(dǎo)航欄高亮顯示的解決方式

    今天小編就為大家分享一篇vue+element導(dǎo)航欄高亮顯示的解決方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • 使用vuex的state狀態(tài)對(duì)象的5種方式

    使用vuex的state狀態(tài)對(duì)象的5種方式

    本文給大家介紹了使用vuex的state狀態(tài)對(duì)象的5種方式,給大家貼出了我的vuex的結(jié)構(gòu),感興趣的朋友跟隨腳本之家小編一起學(xué)習(xí)吧
    2018-04-04
  • 適合前端Vue開發(fā)童鞋的跨平臺(tái)Weex的使用詳解

    適合前端Vue開發(fā)童鞋的跨平臺(tái)Weex的使用詳解

    這篇文章主要介紹了適合前端Vue開發(fā)童鞋的跨平臺(tái)Weex的使用詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10

最新評(píng)論

石阡县| 永春县| 高青县| 涿州市| 民县| 无锡市| 桑植县| 绥芬河市| 临猗县| 垫江县| 金坛市| 鲁甸县| 松原市| 巩义市| 塔河县| 泽州县| 阳曲县| 江西省| 贡嘎县| 邻水| 旅游| 福清市| 聊城市| 安陆市| 噶尔县| 兰溪市| 铁岭县| 灌南县| 溆浦县| 新邵县| 鄯善县| 安阳县| 上虞市| 武汉市| 灯塔市| 祁连县| 筠连县| 汉寿县| 东兴市| 孟村| 霍山县|