詳解Vue的mixin策略
我之前一直以為mixin的合并是以組件內(nèi)的優(yōu)先,即mixin的內(nèi)容如果和組件內(nèi)有沖突的,以組件內(nèi)為準(zhǔn),確實(shí)存在這種情況,但是vue指定的策略更詳細(xì),下面分別記錄各種情況對應(yīng)的合并策略
基本
當(dāng)一個組件使用mixin的時候,所有mixin的選項(xiàng)會被混入到組件自己的選項(xiàng)中, 這部分沒什么好說的,直接看代碼
// define a mixin objectconst myMixin = { created() { this.hello() }, methods: { hello() { console.log(’hello from mixin!’) } }}// define an app that uses this mixinconst app = Vue.createApp({ mixins: [myMixin]})app.mount(’#mixins-basic’) // => 'hello from mixin!'
選項(xiàng)的合并策略
這里的選項(xiàng)指的就是 data methods和生命周期鉤子函數(shù)這些選項(xiàng),他們的會采取不同的合并策略
像data,methods,components,directives這樣的會被合并進(jìn)同一個對象中,并且遇到?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ù)就不是簡單的替換了,如果有同名的,他們會被一起合并進(jìn)數(shù)組中,然后依次調(diào)用,且mixin的鉤子函數(shù)會率先被調(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 optionapp.mixin({ created() { const myOption = this.$options.myOption if (myOption) { console.log(myOption) } }})app.mount(’#mixins-global’) // => 'hello!'
上述代碼,我們在全局創(chuàng)建了一個自定義選項(xiàng),然后進(jìn)行了全局混入處理,但是需要注意的是,這會影響到這個app所有的子組件:
const app = Vue.createApp({ myOption: ’hello!’})// inject a handler for `myOption` custom optionapp.mixin({ created() { const myOption = this.$options.myOption if (myOption) { console.log(myOption) } }})// add myOption also to child componentapp.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}
合并策略接收兩個參數(shù),分別是指定項(xiàng)在父實(shí)例和子實(shí)例的值,當(dāng)使用mixin的時候我們可以查看打印什么:
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很容易造成沖突,你得確保不會有沖突的屬性名,來避免沖突,這會造成額外的負(fù)擔(dān) 復(fù)用性有限,因?yàn)閙ixin不能接受參數(shù),所以邏輯是寫定的,不靈活所以官方推薦使用 Composition Api來組織邏輯
以上就是詳解Vue的mixin策略的詳細(xì)內(nèi)容,更多關(guān)于Vue的mixin策略的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!
相關(guān)文章:
1. WML語言的基本情況2. Python過濾掉numpy.array中非nan數(shù)據(jù)實(shí)例3. python利用platform模塊獲取系統(tǒng)信息4. Python 多線程之threading 模塊的使用5. CSS代碼檢查工具stylelint的使用方法詳解6. 淺談python多線程和多線程變量共享問題介紹7. Python如何批量獲取文件夾的大小并保存8. react axios 跨域訪問一個或多個域名問題9. Python的Tqdm模塊實(shí)現(xiàn)進(jìn)度條配置10. python 實(shí)現(xiàn)rolling和apply函數(shù)的向下取值操作
