欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Vue的mixin策略

 更新時(shí)間:2020年11月19日 08:33:46   作者:homyeeking  
這篇文章主要介紹了Vue的mixin策略的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)vue框架,感興趣的朋友可以了解下

我之前一直以為mixin的合并是以組件內(nèi)的優(yōu)先,即mixin的內(nèi)容如果和組件內(nèi)有沖突的,以組件內(nèi)為準(zhǔn),確實(shí)存在這種情況,但是vue指定的策略更詳細(xì),下面分別記錄各種情況對(duì)應(yīng)的合并策略

基本

當(dāng)一個(gè)組件使用mixin的時(shí)候,所有mixin的選項(xiàng)會(huì)被混入到組件自己的選項(xiàng)中, 這部分沒(méi)什么好說(shuō)的,直接看代碼

// 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è)對(duì)象中,并且遇到?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"

而對(duì)于鉤子函數(shù)就不是簡(jiǎn)單的替換了,如果有同名的,他們會(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!"

上述代碼,我們?cè)谌謩?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!"

我們可以看到,對(duì)于自定義選項(xiàng)這不是簡(jiǎn)單的替換,而是分別調(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ì)有沖突的屬性名,來(lái)避免沖突,這會(huì)造成額外的負(fù)擔(dān)
  • 復(fù)用性有限,因?yàn)閙ixin不能接受參數(shù),所以邏輯是寫(xiě)定的,不靈活

所以官方推薦使用 Composition Api來(lái)組織邏輯

以上就是詳解Vue的mixin策略的詳細(xì)內(nèi)容,更多關(guān)于Vue的mixin策略的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評(píng)論