混入(mixin)似乎也是個初學 Vue 比較少被用到的功能,但還是照順序的了解一下。
基礎運用
在模組中如果有重複出現的模組 option 內容,就可以透過 mixin 將其獨立,並匯入到會使用到該內容的模組裡。
透過創建一個新變數A將重複出現的模組 option 內容集結起來後,再用 mixins:[變數名A] 將資料匯入到模組中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
   | <component-a></component-a> <p>根模組 mixinData :{{mixinData}}</p> <p>根模組 mixinNum :{{mixinNum}}</p> <p>根模組 computedNum :{{computedNum}}</p>
  <script> const Mymixin = {   created() {     this.mixinData = "我是被匯入(mixin)的資料";   },   computed: {     computedNum() {       return this.mixinNum+1;     }   } }; Vue.component("component-a", {   mixins: [Mymixin],   template: `<div>     <p>模組內 mixinData :{{mixinData}}</p>     <p>模組內 mixinNum :{{mixinNum}}</p>     <p>模組內 computedNum :{{computedNum}}</p>   </div>`,   data() {     return {       mixinData: "",       mixinNum: 0     };   } });
  const vm = new Vue({   el: "#vm",   mixins: [Mymixin],   data: {     mixinData: "",     mixinNum: 10   } }); </script>
   | 
 
發生衝突時的選項合併
以下是在匯入的資料跟模組發生衝突時,Vue 本身對衝突的解決方法。
假設匯入資料跟模組資料具有相同的數據資料
數據資料
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
   | <component-a></component-a> <p>根模組 mixinNum :{{mixinNum}}</p> <p>根模組 computedNum :{{computedNum}}</p> <button @click="conflicting">試試重複的methods,打開console</button> <script> const Mymixin = {    data() {     return {       mixinData: "我是mixin內的資料",       mixinNum: 50     };   },   computed: {     computedNum() {       console.log("我是被匯入(mixin)的computedNum資料");       return this.mixinNum + 1;     }   },   methods: {     conflicting() {       console.log("from mixin");     }   } }; Vue.component("component-a", {   mixins: [Mymixin],   template: `<div>     <p>模組內 mixinNum :{{mixinNum}}</p>     <p>模組內 computedNum :{{computedNum}}</p>     <button @click="conflicting">試試重複的methods,打開console</button>   </div>`,   data() {     return {       mixinNum: 0     };   },   computed: {     computedNum() {       console.log("我是模組內原本的computedNum資料");       return this.mixinNum + 20;     }   },   methods: {     conflicting() {       console.log("模組內");     }   } });
  const vm = new Vue({   el: "#vm",   mixins: [Mymixin],   data: {     mixinNum: 10   },   computed: {     computedNum() {       console.log("我是根模組內原本computedNum資料");       return this.mixinNum + 100;     }   },   methods: {     conflicting() {       console.log("根模組");     }   } }); </script>
   | 
 
在上面的例子中會發現: mixins 及模組內的數據資料如果發生衝突,最後一定是模組內的資料獲勝(得到的一定是模組內的資料),我自己理解為模組內的數據資料會直接取代掉 mixins 內的數據資料,以 conflicting() 得知在 console 中 mixins 的 conflicting() 連出現都沒有出現。
鉤子函數(lifecycle hooks)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
   | <component-a></component-a> <p>根模組 mixinNum :{{mixinNum}}</p> <p>根模組 computedNum :{{computedNum}}</p> <button @click="conflicting">試試重複的methods,打開console</button> <script> const Mymixin = {   created() {     console.log("我是被匯入(mixin)的資料");     this.mixinData = "我是被匯入(mixin)的資料";   } }; Vue.component("component-a", {   mixins: [Mymixin],   template: `<div>   </div>`,   data() {     return {       mixinData: ""     };   },   created() {     console.log("我是模組內原本的資料");     this.mixinData = "我是模組內原本的資料";   } });
  const vm = new Vue({   el: "#vm",   mixins: [Mymixin],   data: {     mixinData: ""   },   created() {     console.log("我是根模組內原本資料");     this.mixinData = "我是根模組內原本的資料";   } }); </script>
   | 
 
最後 console 出現的順序如下圖
在上面的例子中會發現: mixins 及模組內的鉤子函數都會被執行,但是模組的鉤子函數一定比 mixins 的晚出現,這代表模組的鉤子函數會去覆蓋 mixins 的,如果在鉤子函數中有資料被變更了,那麼就是 mixins 的鉤子函數會先將資料修改 → 模組的鉤子函數在修改一次資料,最終顯示的資料內容還是模組變更的那些。
Vue 在處理 mixins 跟模組數據資料及鉤子函數衝突時的不同:
| 發生衝突 | 
數據資料 | 
鉤子函數 | 
| mixins | 
不執行 | 
執行 | 
| 模組 | 
執行 | 
執行 | 
| 處理方式 | 
模組取代mixins | 
模組覆蓋mixins | 
全域註冊 mixin –不建議使用
因為會影響所有模組因為會影響所有模組(包含第三方插件),所以不建議使用全域註冊 mixin 。
不須在模組內使用 mixins:[...] 載入了。
Demo
  See the Pen 
  DAY18 | 跟 Vue.js 認識的30天 - Vue 模組混入(`mixin`) by Celeste6666 (@celeste6666)
  on CodePen.
參考資料
Vue.js - 混入