国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

【源碼解析】Vue.js的監(jiān)聽實(shí)現(xiàn)

freewolf / 1912人閱讀

摘要:這段代碼出現(xiàn)在解析屬性的時(shí)候,即調(diào)用方法配置的屬性。最終是周知訂閱者更新,那么上面的數(shù)據(jù)變更就是發(fā)布者。在指令中實(shí)例化了,函數(shù)負(fù)責(zé)來更新在解析模板的時(shí)候會(huì)解析,然后綁定,實(shí)例化,這樣模板就關(guān)聯(lián)在一起了。

本文地址: http://www.iamaddy.net/2016/1...

一說到監(jiān)聽,當(dāng)然就離不了設(shè)計(jì)模式中鼎鼎大名的觀察者模式。舉個(gè)例子,你家后院著火了,可一定要等到煙霧很大火光很亮你才能發(fā)現(xiàn)啊,可是當(dāng)你安裝了一個(gè)火災(zāi)預(yù)警器,當(dāng)發(fā)生火災(zāi)就立馬能夠通知到你了。這就是一個(gè)典型的觀察者模式。當(dāng)然也還有一些其他變種,比如發(fā)布/訂閱(publish/subscribe)模式。

我們知道如果要將數(shù)據(jù)和視圖關(guān)聯(lián)起來,在數(shù)據(jù)變更的時(shí)候,同步視圖,同理視圖變更,數(shù)據(jù)也發(fā)生變化。vue.js是怎么實(shí)現(xiàn)這個(gè)的呢?下面我們來揭開它的神秘面紗。
demo:


{{ message }}

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();
}

這段代碼出現(xiàn)在解析data屬性的時(shí)候,即調(diào)用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(訂閱者)更新,那么上面的數(shù)據(jù)變更就是發(fā)布者。
subscribe是Watcher這個(gè)類的實(shí)例化對(duì)象,在實(shí)例化的時(shí)候,會(huì)傳入回調(diào)函數(shù)來執(zhí)行update,vue弄了一個(gè)隊(duì)列來執(zhí)行watcher的更新函數(shù),具體可參考源碼。

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中實(shí)例化了Watcher,_update函數(shù)負(fù)責(zé)來更新

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
      });

在解析模板的時(shí)候會(huì)解析Directive,然后綁定,實(shí)例化watcher,這樣模板-data就關(guān)聯(lián)在一起了。

觀察者模式

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

利用觀察者模式,在典型的ajax應(yīng)用中,回調(diào)的處理邏輯可以不跟請(qǐng)求耦合在一塊,這樣邏輯上也會(huì)更加清晰。如下是一個(gè)簡單的發(fā)布/訂閱模式的實(shí)現(xiàn)

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);

這就是一個(gè)簡單的訂閱發(fā)布系統(tǒng),每注冊(cè)一個(gè)訂閱者,其實(shí)就是將其回調(diào)處理的callback保存在一個(gè)字典對(duì)象的數(shù)組中,字典對(duì)象的key值可以隨意定義,只要與發(fā)布時(shí)的key對(duì)應(yīng)起來就好。怎么使用呢?


最后一個(gè)將不會(huì)打印出來,因?yàn)橐呀?jīng)取消訂閱了。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/87764.html

相關(guān)文章

  • Vue.js 源碼學(xué)習(xí)筆記

    摘要:實(shí)際上,我在看代碼的過程中順手提交了這個(gè),作者眼明手快,當(dāng)天就進(jìn)行了修復(fù),現(xiàn)在最新的代碼里已經(jīng)不是這個(gè)樣子了而且狀態(tài)機(jī)標(biāo)識(shí)由字符串換成了數(shù)字常量,解析更準(zhǔn)確的同時(shí)執(zhí)行效率也會(huì)更高。 最近饒有興致的又把最新版?Vue.js?的源碼學(xué)習(xí)了一下,覺得真心不錯(cuò),個(gè)人覺得 Vue.js 的代碼非常之優(yōu)雅而且精辟,作者本身可能無 (bu) 意 (xie) 提及這些。那么,就讓我來吧:) 程序結(jié)構(gòu)梳...

    darkbaby123 評(píng)論0 收藏0
  • Vue.js 源碼學(xué)習(xí)筆記

    摘要:實(shí)際上,我在看代碼的過程中順手提交了這個(gè),作者眼明手快,當(dāng)天就進(jìn)行了修復(fù),現(xiàn)在最新的代碼里已經(jīng)不是這個(gè)樣子了而且狀態(tài)機(jī)標(biāo)識(shí)由字符串換成了數(shù)字常量,解析更準(zhǔn)確的同時(shí)執(zhí)行效率也會(huì)更高。 最近饒有興致的又把最新版?Vue.js?的源碼學(xué)習(xí)了一下,覺得真心不錯(cuò),個(gè)人覺得 Vue.js 的代碼非常之優(yōu)雅而且精辟,作者本身可能無 (bu) 意 (xie) 提及這些。那么,就讓我來吧:) 程序結(jié)構(gòu)梳...

    jsdt 評(píng)論0 收藏0
  • 太原面經(jīng)分享:如何在vue面試環(huán)節(jié),展示你晉級(jí)阿里P6+技術(shù)功底?

    摘要:假如你通過閱讀源碼,掌握了對(duì)的實(shí)現(xiàn)原理,對(duì)生態(tài)系統(tǒng)有了充分的認(rèn)識(shí),那你會(huì)在面試環(huán)節(jié)游刃有余,達(dá)到晉級(jí)阿里的技術(shù)功底,從而提高個(gè)人競爭力,面試加分更容易拿。 前言 一年一度緊張刺激的高考開始了,與此同時(shí),我也沒閑著,奔走在各大公司的前端面試環(huán)節(jié),不斷積累著經(jīng)驗(yàn),一路升級(jí)打怪。 最近兩年,太原作為一個(gè)準(zhǔn)二線城市,各大互聯(lián)網(wǎng)公司的技術(shù)棧也在升級(jí)換代,假如你在太原面試前端崗位,而你的技術(shù)庫里若...

    xiaoqibTn 評(píng)論0 收藏0
  • JavaScript 進(jìn)階之深入理解數(shù)據(jù)雙向綁定

    摘要:當(dāng)我們的視圖和數(shù)據(jù)任何一方發(fā)生變化的時(shí)候,我們希望能夠通知對(duì)方也更新,這就是所謂的數(shù)據(jù)雙向綁定。返回值返回傳入函數(shù)的對(duì)象,即第一個(gè)參數(shù)該方法重點(diǎn)是描述,對(duì)象里目前存在的屬性描述符有兩種主要形式數(shù)據(jù)描述符和存取描述符。 前言 談起當(dāng)前前端最熱門的 js 框架,必少不了 Vue、React、Angular,對(duì)于大多數(shù)人來說,我們更多的是在使用框架,對(duì)于框架解決痛點(diǎn)背后使用的基本原理往往關(guān)注...

    sarva 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<