vue mixin執行覆蓋


vue 自帶的mixin如果鈎子函數重復會被組合為一個數組,然后全部從mixin -> widget自動執行。

這里我們改為override的模式,讓重寫的鈎子需要手動調用super去執行(並不強制)

修改鈎子

function dedupeHooks(hooks) {
  const res = []
  for (let i = 0; i < hooks.length; i++) {
    if (res.indexOf(hooks[i]) === -1) {
      res.push(hooks[i])
    }
  }
  return res
}

// 這里只做mounted鈎子示例
Vue.config.optionMergeStrategies.mounted = function(superVal, val) {
  
  const res = val ?
    superVal ?
    
    // vue自己的邏輯
    // superVal.concat(val)

    [function() {
      this.$$super = {
        mounted: () => superVal.forEach( it => it.call(this) )
      }
    }].concat(val)
    
    :
    Array.isArray(val) ?
    val : [val] :
    superVal;
  
  return res ?
    dedupeHooks(res) :
    res
}

組件內:

{
  mixins: [ListMoreDataMixin],
  mounted() {
    this.$$super.mounted();
    console.log('widget mounted');
    this.$$super.mounted();
  },
}

mixin內:

export const ListMoreDataMixin = {
  mounted() {
    console.log('mixin mounted');
  }
}

打印結果

mixin mounted
widget mounted
mixin mounted

如果組件沒有重寫mounted那么就會自動執行mixin的mounted,重寫就手動調用super


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM