詳解Vue的mixin策略
我之前一直以為mixin的合并是以組件內(nèi)的優(yōu)先,即mixin的內(nèi)容如果和組件內(nèi)有沖突的,以組件內(nèi)為準(zhǔn),確實(shí)存在這種情況,但是vue指定的策略更詳細(xì),下面分別記錄各種情況對應(yīng)的合并策略
基本
當(dāng)一個(gè)組件使用mixin的時(shí)候,所有mixin的選項(xiàng)會(huì)被混入到組件自己的選項(xiàng)中, 這部分沒什么好說的,直接看代碼
// define a mixin object
const myMixin = {
created() {
this.hello()
},
methods: {
hello() {
console.log('hello from mixin!')
}
}
}
// define an app that uses this mixin
const app = Vue.createApp({
mixins: [myMixin]
})
app.mount('#mixins-basic') // => "hello from mixin!"
選項(xiàng)的合并策略
這里的選項(xiàng)指的就是 data methods和生命周期鉤子函數(shù)這些選項(xiàng),他們的會(huì)采取不同的合并策略
像data,methods,components,directives這樣的會(huì)被合并進(jìn)同一個(gè)對象中,并且遇到?jīng)_突項(xiàng)以組件的為準(zhǔn)
const myMixin = {
data() {
return {
message: 'hello',
foo: 'abc'
}
}
}
const app = Vue.createApp({
mixins: [myMixin],
data() {
return {
message: 'goodbye',
bar: 'def'
}
},
created() {
console.log(this.$data) // => { message: "goodbye", foo: "abc", bar: "def" }
}
})
const myMixin = {
methods: {
foo() {
console.log('foo')
},
conflicting() {
console.log('from mixin')
}
}
}
const app = Vue.createApp({
mixins: [myMixin],
methods: {
bar() {
console.log('bar')
},
conflicting() {
console.log('from self')
}
}
})
const vm = app.mount('#mixins-basic')
vm.foo() // => "foo"
vm.bar() // => "bar"
vm.conflicting() // => "from self"
而對于鉤子函數(shù)就不是簡單的替換了,如果有同名的,他們會(huì)被一起合并進(jìn)數(shù)組中,然后依次調(diào)用,且mixin的鉤子函數(shù)會(huì)率先被調(diào)用
const myMixin = {
created() {
console.log('mixin hook called')
}
}
const app = Vue.createApp({
mixins: [myMixin],
created() {
console.log('component hook called')
}
})
// => "mixin hook called"
// => "component hook called"
全局混入和自定義選項(xiàng)
const app = Vue.createApp({
myOption: 'hello!'
})
// inject a handler for `myOption` custom option
app.mixin({
created() {
const myOption = this.$options.myOption
if (myOption) {
console.log(myOption)
}
}
})
app.mount('#mixins-global') // => "hello!"
上述代碼,我們在全局創(chuàng)建了一個(gè)自定義選項(xiàng),然后進(jìn)行了全局混入處理,但是需要注意的是,這會(huì)影響到這個(gè)app所有的子組件:
const app = Vue.createApp({
myOption: 'hello!'
})
// inject a handler for `myOption` custom option
app.mixin({
created() {
const myOption = this.$options.myOption
if (myOption) {
console.log(myOption)
}
}
})
// add myOption also to child component
app.component('test-component', {
myOption: 'hello from component!'
})
app.mount('#mixins-global')
// => "hello!"
// => "hello from component!"
我們可以看到,對于自定義選項(xiàng)這不是簡單的替換,而是分別調(diào)用,當(dāng)然我們也可以制定我們自己的合并策略:
const app = Vue.createApp({})
app.config.optionMergeStrategies.customOption = (toVal, fromVal) => {
// return mergedVal
}
合并策略接收兩個(gè)參數(shù),分別是指定項(xiàng)在父實(shí)例和子實(shí)例的值,當(dāng)使用mixin的時(shí)候我們可以查看打印什么:
const app = Vue.createApp({
custom: 'hello!'
})
app.config.optionMergeStrategies.custom = (toVal, fromVal) => {
console.log(fromVal, toVal)
// => "goodbye!", undefined
// => "hello", "goodbye!"
return fromVal || toVal
}
app.mixin({
custom: 'goodbye!',
created() {
console.log(this.$options.custom) // => "hello!"
}
})
可以看到第一次從mixin打印,然后從app打印。
注意事項(xiàng)
- mixin很容易造成沖突,你得確保不會(huì)有沖突的屬性名,來避免沖突,這會(huì)造成額外的負(fù)擔(dān)
- 復(fù)用性有限,因?yàn)閙ixin不能接受參數(shù),所以邏輯是寫定的,不靈活
所以官方推薦使用 Composition Api來組織邏輯
以上就是詳解Vue的mixin策略的詳細(xì)內(nèi)容,更多關(guān)于Vue的mixin策略的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
element表格el-table實(shí)現(xiàn)虛擬滾動(dòng)解決卡頓問題
當(dāng)頁面數(shù)據(jù)過多,前端渲染大量的DOM時(shí),會(huì)造成頁面卡死問題,本文主要介紹了element表格el-table實(shí)現(xiàn)虛擬滾動(dòng)解決卡頓問題,具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10
vue.js使用v-pre與v-html輸出HTML操作示例
這篇文章主要介紹了vue.js使用v-pre與v-html輸出HTML操作,結(jié)合實(shí)例形式分析了vue.js基于v-pre與v-html屬性輸出HTML的具體操作技巧,需要的朋友可以參考下2018-07-07
解決Vue項(xiàng)目中tff報(bào)錯(cuò)的問題
這篇文章主要介紹了解決Vue項(xiàng)目中tff報(bào)錯(cuò)的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-10-10
vue axios調(diào)用接口方法報(bào)錯(cuò)500 internal server err
前端使用axios 訪問后端接口時(shí)報(bào)錯(cuò),在瀏覽器中點(diǎn)擊紅色的報(bào)錯(cuò)數(shù)據(jù),本文給大家分享vue axios調(diào)用接口方法報(bào)錯(cuò)500 internal server error的兩種解決方法,感興趣的朋友一起看看吧2023-10-10
vue.js實(shí)現(xiàn)簡單計(jì)時(shí)器功能
這篇文章主要為大家詳細(xì)介紹了vue.js實(shí)現(xiàn)簡單計(jì)時(shí)器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08
Vue實(shí)現(xiàn)數(shù)字動(dòng)畫的幾種方案
本文介紹了三種使用Vue實(shí)現(xiàn)動(dòng)態(tài)數(shù)字動(dòng)畫的方案:使用Vue的響應(yīng)式數(shù)據(jù)與`setInterval`逐步更新數(shù)字,通過Vue的動(dòng)畫API和CSS動(dòng)畫效果為數(shù)字增加過渡效果,以及使用更高效的`requestAnimationFrame`來提供更加流暢的動(dòng)畫表現(xiàn),每種方案都詳細(xì)說明了原理、實(shí)現(xiàn)步驟和代碼示例2025-02-02
解決echarts圖表y軸數(shù)據(jù)間隔過大的問題
這篇文章主要介紹了解決echarts圖表y軸數(shù)據(jù)間隔過大的問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03

