Vue mixin(混合)筆記

Vue mixins(混合)

用途

為組件定義可復用的方法,可以在mixin對象里定義組件的任何屬性拔疚,在組件使用mixin時,mixin中的屬性會添加到組件屬性中

定義mixin
組件內(nèi)mixin
<template>
  <div class="mixins">
    <span>{{msg | uppercase}}</span>
  </div>
</template>

<script>
  const myMixin = {
    created(){
      this.hello();
    },
    methods: {
      hello(){
        window.console.log(this.msg)
      }
    }
  };
  export default {
    mixins: [myMixin],
    name: 'mixins',
    data () {
      return {
        msg: 'mixin',

      }
    }
  }
</script>
全局mixin(使用Vue.mixin()方法)
Vue.mixin({
  created(){
    console.log('global mixin')
  }
});

在定義全局mixin之創(chuàng)建的Vue實例都會將mixin對象里的屬性添加到實例中

new Vue({
  el: '#app',
  router,
  template: '<App/>',
  components: { App }
});
const Component = Vue.extend({
  template:'<span>121</span>'

});
Vue.mixin({
  created(){
    window.console.log('global mixin')
  }
});
const component=new Component();

這段代碼中由于mixin是在App生成之后定義的,只會在創(chuàng)建Component實例的時候才會添加到實例屬性中币励,created執(zhí)行一次吱殉。

全局mixin與組件內(nèi)mixin沖突
  • case1:

    /*全局mixin*/
    Vue.mixin({
      created(){
        window.console.log('global mixin')
      },
      methods:{
        hello(){
          window.console.log('global:'+this.msg)
        }
      }
    });
    /*組件內(nèi)mixin*/
    const myMixin = {
        created(){
          this.hello();
        },
        methods: {
        }
      };
    /*執(zhí)行結(jié)果*/
    /*
    global mixin      main.js:16 
    global mixin      main.js:16
    global mixin      main.js:16
    global:mixin      main.js:20 全局mixin中定義的hello方法
    */
    

    每次創(chuàng)建組件時掸冤,全局mixin都會添加到組件實例中,如果全局mixin和組件內(nèi)mixin有同名的鉤子函數(shù)友雳,鉤子函數(shù)都會執(zhí)行稿湿,并且先執(zhí)行先執(zhí)行全局后執(zhí)行組件內(nèi)。

  • case2

    /*全局mixin*/
    Vue.mixin({
      created(){
        this.hello();
      },
      methods:{
        hello(){
          window.console.log('global:'+this.msg)
        }
      }
    });
    /*組件內(nèi)mixin*/
    const myMixin = {
        created(){
          this.hello();
        },
        methods: {
          hello(){
            window.console.log(this.msg)
          }
        }
      };
    /*執(zhí)行結(jié)果*/
    /*
    global:undefined          main.js:20
    global:undefined      main.js:20 //這是其他組件調(diào)用的全局mixin
    mixin             app.8b4a0e8….js:161 //全局中的
    mixin             app.8b4a0e8….js:161 //組件中的
    */
    

    對于非鉤子函數(shù)押赊,組件實例的對象屬性饺藤,組件內(nèi)的會覆蓋全局的。

  • case3:組件內(nèi)定義的optionsmixin沖突

    /*全局mixin:同case2*/
    /*組件內(nèi)mixin:同case2*/
    /*組件內(nèi)定義的options*/
    export default {
        mixins: [myMixin],
        name: 'mixins',
        created(){
          window.console.log('inner');
            this.hello();
        },
        data () {
          return {
            msg: 'mixin',
    
          }
        },
        methods:{
            hello(){
              window.console.log('inner:'+this.msg)
            }
        }
      }
    /*執(zhí)行結(jié)果*/
    /*
    global:undefined          main.js:20
    global:undefined          main.js:20
    inner:mixin           app.bd90e4d….js:181 
    inner:mixin           app.bd90e4d….js:181 
    inner             app.bd90e4d….js:169 
    inner:mixin           app.bd90e4d….js:181
    */
    

總結(jié):Vue混合策略

  1. vue 是安裝 全局mixin——組件內(nèi)mixin——組件options的順序來合并組件實例的options。
  2. 對于鉤子函數(shù)策精,會添加到一個函數(shù)數(shù)組里舰始,執(zhí)行順序從前到后
  3. 對于組件的對象屬性(methods等),后面的會覆蓋前面的
實現(xiàn)全局mixin的鉤子函數(shù)在指定組件中執(zhí)行/不執(zhí)行

? 在時機使用過程中,如果希望鉤子函數(shù)中的代碼只在指定的組件中執(zhí)行咽袜,可以使用組件自定義options來實現(xiàn)丸卷,類似methods等,在定義組件時添加自定義標記:

/*全局mixin*/
Vue.mixin({
  created(){
    if(this.$options['myOptions']){
      console.log('run');
      this.hello();
    }

  }
});
/*組件內(nèi)添加*/
myOptions:{
        run:true
    }
/*運行結(jié)果*/
/*
run             main.js:17
inner:mixin     app.ab88047….js:176 
*/
相關(guān)鏈接
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末询刹,一起剝皮案震驚了整個濱河市谜嫉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌凹联,老刑警劉巖沐兰,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蔽挠,居然都是意外死亡住闯,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門澳淑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來比原,“玉大人,你說我怎么就攤上這事杠巡×烤剑” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵氢拥,是天一觀的道長蚌铜。 經(jīng)常有香客問我,道長嫩海,這世上最難降的妖魔是什么冬殃? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮出革,結(jié)果婚禮上造壮,老公的妹妹穿的比我還像新娘。我一直安慰自己骂束,他們只是感情好耳璧,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著展箱,像睡著了一般旨枯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上混驰,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天攀隔,我揣著相機與錄音皂贩,去河邊找鬼。 笑死昆汹,一個胖子當著我的面吹牛明刷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播满粗,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼辈末,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了映皆?” 一聲冷哼從身側(cè)響起挤聘,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎捅彻,沒想到半個月后组去,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡步淹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年从隆,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贤旷。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡广料,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出幼驶,到底是詐尸還是另有隱情,我是刑警寧澤韧衣,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布盅藻,位于F島的核電站,受9級特大地震影響畅铭,放射性物質(zhì)發(fā)生泄漏氏淑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一硕噩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦栅隐、人聲如沸清女。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽眶俩。三九已至,卻和暖如春快鱼,著一層夾襖步出監(jiān)牢的瞬間颠印,已是汗流浹背纲岭。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留线罕,地道東北人止潮。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像钞楼,于是被迫代替她去往敵國和親喇闸。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容