element-ui的broadcast與dispatch

眾所周知,Vue 在 2.0 版本中去除了broadcast方法以及dispatch 方法,最近在學(xué)習(xí)餓了么的Element時(shí)重新實(shí)現(xiàn)了這兩種方法,并以 minix 的方式引入。

看一下源代碼

function broadcast(componentName, eventName, params) {
  /*遍歷當(dāng)前節(jié)點(diǎn)下的所有子組件*/
  this.$children.forEach(child => {
    /*獲取子組件名稱(chēng)*/
    var name = child.$options.componentName;

    if (name === componentName) {
      /*如果是我們需要廣播到的子組件的時(shí)候調(diào)用$emit觸發(fā)所需事件,在子組件中用$on監(jiān)聽(tīng)*/
      child.$emit.apply(child, [eventName].concat(params));
    } else {
      /*非所需子組件則遞歸遍歷深層次子組件*/
      broadcast.apply(child, [componentName, eventName].concat([params]));
    }
  });
}
export default {
  methods: {
    /*對(duì)多級(jí)父組件進(jìn)行事件派發(fā)*/
    dispatch(componentName, eventName, params) {
      /*獲取父組件,如果以及是根組件,則是$root*/
      var parent = this.$parent || this.$root;
      /*獲取父節(jié)點(diǎn)的組件名*/
      var name = parent.$options.componentName;

      while (parent && (!name || name !== componentName)) {
        /*當(dāng)父組件不是所需組件時(shí)繼續(xù)向上尋找*/
        parent = parent.$parent;

        if (parent) {
          name = parent.$options.componentName;
        }
      }
      /*找到所需組件后調(diào)用$emit觸發(fā)當(dāng)前事件*/
      if (parent) {
        parent.$emit.apply(parent, [eventName].concat(params));
      }
    },
    /*
        向所有子組件進(jìn)行事件廣播。
        這里包了一層,為了修改broadcast的this對(duì)象為當(dāng)前Vue實(shí)例
    */
    broadcast(componentName, eventName, params) {
      broadcast.call(this, componentName, eventName, params);
    }
  }
};

其實(shí)這里的broadcast與dispatch實(shí)現(xiàn)了一個(gè)定向的多層級(jí)父子組件間的事件廣播及事件派發(fā)功能。完成多層級(jí)分發(fā)對(duì)應(yīng)事件的組件間通信功能。

broadcast通過(guò)遞歸遍歷子組件找到所需組件廣播事件,而dispatch則逐級(jí)向上查找對(duì)應(yīng)父組件派發(fā)事件。

broadcast需要三個(gè)參數(shù),componentName(組件名),eventName(事件名稱(chēng))以及params(數(shù)據(jù))。根據(jù)componentName深度遍歷子組件找到對(duì)應(yīng)組件emit事件eventName。

dispatch同樣道理,需要三個(gè)參數(shù),componentName(組件名),eventName(事件名稱(chēng))以及params(數(shù)據(jù))。根據(jù)componentName向上級(jí)一直尋找對(duì)應(yīng)父組件,找到以后emit事件eventName。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容