真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯網站制作重慶分公司

Vue.js如何實現監(jiān)聽

這篇文章主要為大家展示了“Vue.js如何實現監(jiān)聽”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“Vue.js如何實現監(jiān)聽”這篇文章吧。

創(chuàng)新互聯建站是專業(yè)的玉泉街道網站建設公司,玉泉街道接單;提供網站設計制作、做網站,網頁設計,網站設計,建網站,PHP網站建設等專業(yè)做網站服務;采用PHP框架,可快速的進行玉泉街道網站開發(fā)網頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網站,專業(yè)的做網站團隊,希望更多企業(yè)前來合作!

demo:

 

 

 {{ message }}  

 
new Vue({  el: '#app',  data: {  message: 'Hello Vue.js!'  } }); set: function reactiveSetter(newVal) {  var value = getter ? getter.call(obj) : val;  if (newVal === value) {  return;  }  if (setter) {  setter.call(obj, newVal);  } else {  val = newVal;  }  childOb = observe(newVal);  dep.notify(); }

這段代碼出現在解析data屬性的時候,即調用Object.defineProperty方法配置data的屬性。一旦屬性發(fā)生變化,就notify發(fā)送廣播。

Dep.prototype.notify = function () {
 // stablize the subscriber list first
 var subs = toArray(this.subs);
 for (var i = 0, l = subs.length; i < l; i++) {
 subs[i].update();
 }
};

notify 最終是周知subscribe(訂閱者)更新,那么上面的數據變更就是發(fā)布者。 subscribe是Watcher這個類的實例化對象,在實例化的時候,會傳入回調函數來執(zhí)行update,vue弄了一個隊列來執(zhí)行watcher的更新函數,具體可參考源碼。

Watcher.prototype.run = function () {
 ……
 if (value !== this.value || (isObject(value) || this.deep) && !this.shallow) {
 ……
 } else {
 this.cb.call(this.vm, value, oldValue);
 }
 }
 this.queued = this.shallow = false;
 }
 };

在Directive(指令)class中實例化了Watcher,_update函數負責來更新

var watcher = this._watcher = new Watcher(this.vm, this.expression, this._update, // callback
 {
 filters: this.filters,
 twoWay: this.twoWay,
 deep: this.deep,
 preProcess: preProcess,
 postProcess: postProcess,
 scope: this._scope
 });

在解析模板的時候會解析Directive,然后綁定,實例化watcher,這樣模板-data就關聯在一起了。

圖片描述

Vue.js如何實現監(jiān)聽

觀察者模式

林林總總的mvc或者mvvm框架基本也都是利用了觀察者模式,這個也非常有用,尤其在復雜的系統之中。

利用觀察者模式,在典型的ajax應用中,回調的處理邏輯可以不跟請求耦合在一塊,這樣邏輯上也會更加清晰。如下是一個簡單的發(fā)布/訂閱模式的實現

var PubSub = {};
(function (q) {
 var topics = {}, subUid = -1;
 q.publish = function (topic) {
 if(!topics[topic]){
  return false;
 }

 var subscribers = topics[topic],
  len = subscribers ? subscribers.length : 0;

 while(len--){
  var args = Array.prototype.slice.call(arguments, 1);
  args.unshift(topic);
  subscribers[len].callback.apply(this, args);
 }
 return this;
 };

 q.subscribe = function (topic, callback) {
 if(!topics[topic]){
  topics[topic] = [];
 }

 var subuid = (++subUid).toString();

 topics[topic].push({
  token: subuid,
  callback: callback
 });

 return subuid;
 };

 q.unsubscribe = function (subid) {
 for(var k in topics){
  if(topics[k]){
  for(var i = 0, j = topics[k].length; i < j; i++){
   if(topics[k][i].token === subid){
   topics[k].splice(i, 1);
   return subid;
   }
  }
  }
 }
 return this;
 };
})(PubSub);

這就是一個簡單的訂閱發(fā)布系統,每注冊一個訂閱者,其實就是將其回調處理的callback保存在一個字典對象的數組中,字典對象的key值可以隨意定義,只要與發(fā)布時的key對應起來就好。

怎么使用呢?

最后一個將不會打印出來,因為已經取消訂閱了。

以上是“Vue.js如何實現監(jiān)聽”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注創(chuàng)新互聯行業(yè)資訊頻道!


文章名稱:Vue.js如何實現監(jiān)聽
文章起源:http://weahome.cn/article/jcghee.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部