gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区

站長資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

一文了解vue中watcher數(shù)據(jù)雙向綁定原理(附代碼)

之前的文章《解析vue中observer數(shù)據(jù)雙向綁定原理(代碼分享)》中,給大家了解了vue中observer數(shù)據(jù)雙向綁定原理。下面本篇文章給大家了解vue中watcher數(shù)據(jù)雙向綁定原理,一定的參考價值,有需要的朋友可以參考一下。

一文了解vue中watcher數(shù)據(jù)雙向綁定原理(附代碼)

vue數(shù)據(jù)雙向綁定原理,和簡單的實現(xiàn),本文將實現(xiàn)mvvmwatcher

一文了解vue中watcher數(shù)據(jù)雙向綁定原理(附代碼)

1)vue數(shù)據(jù)雙向綁定原理-observer

2)vue數(shù)據(jù)雙向綁定原理-wather

3)vue數(shù)據(jù)雙向綁定原理-解析器Complie

vue數(shù)據(jù)雙向綁定原理,和簡單的實現(xiàn),本文將實現(xiàn)mvvmWatcher

上面的步驟已經(jīng)實現(xiàn)了監(jiān)聽器,和訂閱器,當(dāng)屬性發(fā)生改變,發(fā)出通知,那么這個通知是通知誰呢,肯定是訂閱者watcher.Watcher訂閱者作為ObserverCompile之間通信的橋梁,主要做的事情是:

1、在自身實例化時往屬性訂閱器(dep)里面添加自己

2、自身必須有一個update()方法

3、待屬性變動dep.notice()通知時,能調(diào)用自身的update()方法,并觸發(fā)Compile中綁定的回調(diào),則釋放自己。

// Watcher function Watcher(vm, exp, cb) {   this.cb = cb;   this.$vm = vm;   this.exp = exp;   // 此處為了觸發(fā)屬性的getter,從而在dep添加自己,結(jié)合Observer更易理解   this.value = this.get(); // 將自己添加到訂閱器的操作 } Watcher.prototype = {   update: function () {     this.run(); // 屬性值變化收到通知   },   run: function () {     var value = this.get(); // 取到最新值     var oldVal = this.value;     if (value !== oldVal) {       this.value = value;       this.cb.call(this.$vm, value, oldVal); // 執(zhí)行Compile中綁定的回調(diào),更新視圖     }   },   get: function () {     Dep.target = this; // 將當(dāng)前訂閱者指向自己, 緩存     var value = this.$vm[this.exp]; // 強制觸發(fā)監(jiān)聽的getter,添加自己到屬性訂閱器中     Dep.target = null; // 添加完畢,重置釋放     return value;   }, };

訂閱者要緩存自己,并且告訴監(jiān)聽器,要把我加到訂閱器里面去。所以還要改造下監(jiān)聽器

function defineReactive(data, key, val) {   var dep = new Dep()   observe(val); // 監(jiān)聽子屬性   Object.defineProperty(data, key, {     ....     get: function() {       // 由于需要在閉包內(nèi)添加watcher,所以可以在Dep定義一個全局target屬性,暫存watcher, 添加完移除       Dep.target && dep.addDep(Dep.target);       return val;     },     ....   });  }

實例化Watcher的時候,調(diào)用get()方法,通過Dep.target=watcherInstance標(biāo)記訂閱者是當(dāng)前watcher實例,強行觸發(fā)屬性定義的getter方法,getter方法執(zhí)行的時候,就會在屬性的訂閱器dep添加當(dāng)前watcher實例,從而在屬性值有變化的時候watcherInstance就能收到更新通知。

實現(xiàn)MVVM

到這兒先將監(jiān)聽器Observer和監(jiān)聽者Watcher連起來,先模擬一些數(shù)據(jù),實現(xiàn)簡單的數(shù)據(jù)綁定

<div id="name"></div> <script>   function Vue(data, el, exp) {     this.data = data;     observe(data);     el.innerHTML = this.data[exp]; // 初始化模板數(shù)據(jù)的值     new Watcher(this, exp, function (value) {       el.innerHTML = value;     });     return this;   }   var ele = document.querySelector("#name");   var vue = new Vue(     {       name: "hello world",     },     ele,     "name"   );   setInterval(function () {     vue.data.name = "chuchur " + new Date() * 1;   }, 1000); </script>

這可以看到div的和內(nèi)容初始為hello world,每隔一秒之后變換為chuchur加時間戳,雖然是實現(xiàn)了,但是與想象的還差很多。是vue.name不是vue.data.name,所以這里需要給Vue實例添加一個屬性代理的方法,使訪問vm的屬性代理為訪問vm.data的屬性,改造后的代碼如下:

function Vue(options) {    this.$options = options || {};   this.data = this.$options.data;   // 屬性代理,實現(xiàn) vm.xxx -> vm.data.xxx   var self = this;   Object.keys(this.data).forEach(function(key) {      self.proxy(key); // 綁定代理屬性    });   observe(this.data, this);   el.innerHTML = this.data[exp]; // 初始化模板數(shù)據(jù)的值   new Watcher(this, exp, function(value) {      el.innerHTML = value;    });   return this;  }  Vue.prototype = {    proxy: function(key) {     var self = this;     Object.defineProperty(this, key, {       enumerable: false,       configurable: true,       get: function proxyGetter() {         return self.data[key];       },       set: function proxySetter(newVal) {         self.data[key] = newVal;       }     });   }  }

然后就可以通過vue.name,直接改版模板的數(shù)據(jù)了,下一步就要實現(xiàn)解析器Complie

[完]

推薦學(xué)習(xí):JavaScript視頻教程

贊(0)
分享到: 更多 (0)
?
網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
国产激情片在线观看| 阿v天堂2017| 欧美性猛交xxxx乱大交91| 182午夜在线观看| 亚洲精品偷拍视频| 国产美女在线一区| 茄子视频成人免费观看| www.日本一区| 欧美日韩午夜爽爽| 日本一区二区黄色| 九九九九九伊人| 青草青青在线视频| 午夜免费福利在线| 男女爱爱视频网站| 日本精品www| 国产成人三级视频| 国产精品欧美激情在线观看| 黄大色黄女片18第一次| 激情六月天婷婷| 青青青国产在线视频| 伊人久久在线观看| 国产 porn| 777av视频| 黄频视频在线观看| 97公开免费视频| 中文字幕精品在线播放| 丰满人妻中伦妇伦精品app| 国内自拍第二页| 粉嫩虎白女毛片人体| 日b视频免费观看| 国产九九在线观看| 日韩免费毛片视频| 国产美女主播在线| 樱花草www在线| 一路向西2在线观看| 欧日韩免费视频| 日本美女爱爱视频| 日本不卡一区二区在线观看| 国产一区二区在线视频播放| 一级黄色片播放| 岛国毛片在线播放| 992kp快乐看片永久免费网址| 久久久久久久久久久99| 国产情侣第一页| 黄色网络在线观看| 黄色小视频免费网站| 亚洲国产精品毛片av不卡在线| 免费看毛片的网址| 91午夜在线观看| av中文字幕av| 亚洲天堂第一区| 手机在线视频你懂的| 亚洲天堂网2018| 一级黄色录像在线观看| 污版视频在线观看| xxx国产在线观看| 国产理论在线播放| 高清av免费看| 免费网站在线观看黄| 欧美视频亚洲图片| 特黄特黄一级片| 女同性恋一区二区| 日韩精品久久一区二区| 天天爱天天做天天操| 乱子伦一区二区| av在线免费观看国产| 极品粉嫩国产18尤物| 成年在线观看视频| 国产视频一视频二| 国产日韩一区二区在线观看| 99re在线视频免费观看| 福利在线一区二区三区| 性生生活大片免费看视频| 黄色一级片免费播放| 国产专区在线视频| 日韩av三级在线| 成人黄色一区二区| 一区二区三区韩国| 国产精品探花在线播放| 日本a在线天堂| 2018国产在线| 亚洲综合日韩欧美| 狠狠噜天天噜日日噜| 国产精品又粗又长| 少妇一级淫免费放| 992tv成人免费观看| 9久久9毛片又大又硬又粗| 午夜视频你懂的| 久久精品在线免费视频| 国产女女做受ⅹxx高潮| 亚洲美女自拍偷拍| 免费在线观看的av网站| www激情五月| 播放灌醉水嫩大学生国内精品| 国产一区二区在线免费播放| 最近中文字幕免费mv| 免费在线激情视频| 善良的小姨在线| 成年人视频在线免费| 精品国产三级a∨在线| 日韩中文字幕免费在线| 看一级黄色录像| 亚洲一区二区三区四区五区xx| 日韩一级片一区二区| 日本在线观看免费视频| 亚洲国产成人精品无码区99| 特级西西444www| 色一情一乱一伦一区二区三区日本| 三年中国中文在线观看免费播放| 欧美日韩一区二区在线免费观看| 国产麻豆电影在线观看| 无码日韩人妻精品久久蜜桃| 国产美女作爱全过程免费视频| 日本不卡一区二区在线观看| 日本久久久精品视频| 日本免费a视频| 国产成人免费高清视频| 不卡中文字幕在线观看| 国产成人精品无码播放| 久久亚洲中文字幕无码| 亚洲天堂第一区| 深爱五月综合网| 爱情岛论坛亚洲首页入口章节| 成人免费观看视频在线观看| 日韩人妻无码精品久久久不卡| 免费在线精品视频| 亚洲国产精品女人| 五月六月丁香婷婷| 久久久精品高清| 911福利视频| gogogo高清免费观看在线视频| 欧美性猛交久久久乱大交小说| 成人一对一视频| 18禁男女爽爽爽午夜网站免费| 免费av手机在线观看| 男女超爽视频免费播放| av免费观看国产| 成年人午夜免费视频| 国产老熟妇精品观看| 噜噜噜久久亚洲精品国产品麻豆| 成人黄色av片| 日日碰狠狠丁香久燥| 能在线观看的av网站| 三级a三级三级三级a十八发禁止| 北条麻妃av高潮尖叫在线观看| 久久精品视频91| 在线观看av网页| 欧美一级免费在线观看| av动漫在线免费观看| 成人免费观看cn| 欧美丰满熟妇xxxxx| 最新av免费在线观看| 日韩人妻精品一区二区三区| 日本三日本三级少妇三级66| 久久男人资源站| 国产真实乱子伦| 小早川怜子一区二区三区| 女人色极品影院| 少妇人妻互换不带套| 女同激情久久av久久| 欧美中日韩在线| 国产九九在线视频| 粉嫩av一区二区三区天美传媒 | 成人一级生活片| 日日鲁鲁鲁夜夜爽爽狠狠视频97 | 在线看的黄色网址| 美国av在线播放| 97在线播放视频| 成人高清在线观看视频| 日本免费不卡一区二区| 成人不卡免费视频| 一区二区传媒有限公司| 欧美午夜aaaaaa免费视频| 免费看av软件| 青青草原av在线播放| 9l视频自拍9l视频自拍| 国内外免费激情视频| 日本天堂免费a| 岛国毛片在线播放| 欧美啪啪免费视频| 在线观看免费黄色片| 美女一区二区三区视频| 日本精品久久久久久久久久| 亚洲黄色小视频在线观看| 欧美精品在欧美一区二区| 在线观看高清免费视频| 99热久久这里只有精品| 在线观看免费av网址| 女人和拘做爰正片视频| 7777在线视频| 亚洲另类第一页| 免费大片在线观看| 青草青青在线视频| 日韩中文字幕亚洲精品欧美| 色一情一区二区| 欧美精品色婷婷五月综合| 免费在线看黄色片| 中文字幕超清在线免费观看| 中文字幕av不卡在线| 欧美日韩在线免费播放|