vue之mixin的理解與使用

一、概念

混入 (mixin) 提供了一種非常靈活的方式,來分發(fā) Vue 組件中的可復(fù)用功能。一個混入對象可以包含任意組件選項。當(dāng)組件使用混入對象時,所有混入對象的選項將被“混合”進(jìn)入該組件本身的選項。

二、應(yīng)用場景

針對一些基本功能一樣,但又存在足夠差異性的組件之間,有兩種解決方案:
(1)一種是拆分成公共組件,但是這種方式一旦功能變動就要在引入的文件中更新代碼,這違背了DRY原則,反之,太多的props傳值會很快變得混亂,導(dǎo)致項目維護(hù)難度增加。
(2)另一種是使用Mixin,Vue 中的Mixin對編寫函數(shù)式風(fēng)格的代碼很有用,因?yàn)楹瘮?shù)式編程就是通過減少移動的部分讓代碼更好理解。Mixin允許你封裝一塊在應(yīng)用的其他組件中都可以使用的函數(shù)。如果使用姿勢得當(dāng),他們不會改變函數(shù)作用域外部的任何東西,因此哪怕執(zhí)行多次,只要是同樣的輸入你總是能得到一樣的值,真的很強(qiáng)大!

三、基礎(chǔ)使用

(1)常規(guī)操作先建一個mixin文件夾,然后定義一個 js 文件(mixin.js), 為了使用Mixin我們需要輸出一個對象。

export default {
 data() {
  return {
   name: 'mixin'
  }
 },
 created() {
  console.log('mixin...', this.name);
 },
 mounted() {},
 methods: {}
}

多個組件可以共享數(shù)據(jù)和方法,在使用mixin的組件中引入后,mixin中的方法和屬性也就并入到該組件中,可以直接使用。鉤子函數(shù)會兩個都被調(diào)用,mixin中的鉤子首先執(zhí)行。
(2)在Modal.vue中引入這個Mixin:

import Child from './Child'
import toggle from './mixins/toggle'

export default {
    name: 'modal',
    mixins: [toggle],
    components: {
      appChild: Child
    }
  }

即便我們使用的是一個對象而不是一個組件,生命周期函數(shù)對我們來說仍然是可用的,理解這點(diǎn)很重要。我們也可以這里使用mounted()鉤子函數(shù),它將被應(yīng)用于組件的生命周期上。這種工作方式真的很靈活也很強(qiáng)大。

mixin混入對象和Vuex的區(qū)別:

(1)Vuex是狀態(tài)共享管理,所以Vuex中的所有變量和方法都是可以讀取和更改并相互影響的;
(2)mixin可以定義公用的變量或方法,但是mixin中的數(shù)據(jù)是不共享的,也就是每個組件中的mixin實(shí)例都是不一樣的,都是單獨(dú)存在的個體,不存在相互影響的;
(3)mixin混入對象值為函數(shù)的同名函數(shù)選項將會進(jìn)行遞歸合并為數(shù)組,兩個函數(shù)都會執(zhí)行,只不過先執(zhí)行mixin中的同名函數(shù);
(4)mixin混入對象值為對象的同名對象將會進(jìn)行替換,都優(yōu)先執(zhí)行組件內(nèi)的同名對象,也就是組件內(nèi)的同名對象將mixin混入對象的同名對象進(jìn)行覆蓋。

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

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

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