Contamination


Répertoire


Bases


Les Mixins offrent un moyen très flexible de distribuer des fonctions réutilisables dans les composants Vue. Un mixin peut contenir n’importe quelle option de composant. Lorsqu'un composant utilise un mixin, toutes les options du mixin seront "mixées" dans les options du composant lui-même.

Exemple :

// 定义一个混入对象
var myMixin = {
  created: function () {
    this.hello()
  },
  methods: {
    hello: function () {
      console.log('hello from mixin!')
    }
  }
}
// 定义一个使用混入对象的组件
var Component = Vue.extend({
  mixins: [myMixin]
})
var component = new Component() // => "hello from mixin!"


Fusion d'options


Lorsque les composants et les mixins contiennent des options du même nom, ces options seront "fusionnées" de la manière appropriée.

Par exemple, les objets de données sont fusionnés de manière récursive en interne et les données des composants sont prioritaires en cas de conflits.

var mixin = {
  data: function () {
    return {
      message: 'hello',
      foo: 'abc'
    }
  }
}
new Vue({
  mixins: [mixin],
  data: function () {
    return {
      message: 'goodbye',
      bar: 'def'
    }
  },
  created: function () {
    console.log(this.$data)
    // => { message: "goodbye", foo: "abc", bar: "def" }
  }
})

Les fonctions Hook portant le même nom seront combinées dans un tableau, elles seront donc toutes appelées. De plus, le crochet de l'objet mixte sera appelé avant le propre crochet du composant .

var mixin = {
  created: function () {
    console.log('混入对象的钩子被调用')
  }
}
new Vue({
  mixins: [mixin],
  created: function () {
    console.log('组件钩子被调用')
  }
})
// => "混入对象的钩子被调用"
// => "组件钩子被调用"

Les options dont les valeurs sont des objets, telles que méthodes, composants et directives, seront fusionnées dans le même objet. Lorsque les noms de clé de deux objets sont en conflit, la paire clé-valeur de l'objet composant est utilisée. methodscomponentsdirectives,将被合并为同一个对象。两个对象键名冲突时,取组件对象的键值对。

var mixin = {
  methods: {
    foo: function () {
      console.log('foo')
    },
    conflicting: function () {
      console.log('from mixin')
    }
  }
}
var vm = new Vue({
  mixins: [mixin],
  methods: {
    bar: function () {
      console.log('bar')
    },
    conflicting: function () {
      console.log('from self')
    }
  }
})
vm.foo() // => "foo"
vm.bar() // => "bar"
vm.conflicting() // => "from self"

注意:Vue.extend() 也使用同样的策略进行合并。


全局混入


混入也可以进行全局注册。使用时格外小心!一旦使用全局混入,它将影响每一个之后创建的 Vue 实例。使用恰当时,这可以用来为自定义选项注入处理逻辑。

// 为自定义的选项 'myOption' 注入一个处理器。
Vue.mixin({
  created: function () {
    var myOption = this.$options.myOption
    if (myOption) {
      console.log(myOption)
    }
  }
})
new Vue({
  myOption: 'hello!'
})
// => "hello!"

请谨慎使用全局混入,因为它会影响每个单独创建的 Vue 实例 (包括第三方组件)。大多数情况下,只应当应用于自定义选项,就像上面示例一样。推荐将其作为插件发布,以避免重复应用混入。


自定义选项合并策略


自定义选项将使用默认策略,即简单地覆盖已有值。如果想让自定义选项以自定义逻辑合并,可以向 Vue.config.optionMergeStrategies 添加一个函数:

Vue.config.optionMergeStrategies.myOption = function (toVal, fromVal) {
  // 返回合并后的值
}

对于多数值为对象的选项,可以使用与 methods

var strategies = Vue.config.optionMergeStrategies
strategies.myOption = strategies.methods

Remarque : Vue.extend() utilise également la même stratégie pour la fusion.


Global mixin

🎜🎜Les mixins peuvent également être enregistrés à l'échelle mondiale. A utiliser avec une extrême prudence ! Une fois qu'un mixin global est utilisé, il affectera 🎜chaque instance 🎜Vue créée par la suite. Lorsqu'il est utilisé de manière appropriée, cela peut être utilisé pour injecter une logique de traitement pour les options personnalisées. 🎜🎜
const merge = Vue.config.optionMergeStrategies.computed
Vue.config.optionMergeStrategies.vuex = function (toVal, fromVal) {
  if (!toVal) return fromVal
  if (!fromVal) return toVal
  return {
    getters: merge(toVal.getters, fromVal.getters),
    state: merge(toVal.state, fromVal.state),
    actions: merge(toVal.actions, fromVal.actions)
  }
}
🎜Veuillez utiliser les mixins globaux avec prudence car cela affecte chaque instance de Vue créée individuellement (y compris les composants tiers). Dans la plupart des cas, cela ne doit être appliqué qu'aux options personnalisées, comme dans l'exemple ci-dessus. Il est recommandé de le publier en tant que plugin🎜 pour éviter les mixins d'applications répétés. 🎜
🎜🎜🎜

🎜🎜Stratégie de fusion d'options personnalisées🎜🎜🎜🎜🎜Les options personnalisées utiliseront la stratégie par défaut, qui écrase simplement la valeur existante. Si vous souhaitez que les options personnalisées soient fusionnées avec une logique personnalisée, vous pouvez ajouter une fonction à Vue.config.optionMergeStrategies : 🎜🎜rrreee🎜Pour les options avec plusieurs valeurs en tant qu'objets, vous pouvez utiliser méthodes< /code> La même stratégie de fusion : 🎜rrreee🎜 Un exemple plus avancé peut être trouvé dans la stratégie de mixage de 🎜Vuex🎜 1.x : 🎜rrreee🎜🎜🎜🎜 🎜