# 混入(mixin)

混入提供了一种非常灵活的方式,来分发Vue组件中可复用的功能。一个混入对象可以包含任意组件选项。当组件使用混入对象时,所有混入对象的选项将被“混合”进入该组件本身的选项。

# Vue.extend(options)

使用基础的Vue构造器创建一个子类,其中data需要是一个函数,参数是一个包含组件选项的对象

<div id="app">
  <div id="mount-point"></div>
</div>
<script>

  // 创建一个Vue构造器的一个子类
  var Profile = Vue.extend({
    template: '<p>{{firstName}} {{lastName}} - {{alias}}</p>',
    data: function() {
      return {
        firstName: 'Guoqing',
        lastName: 'Zuo',
        alias: 'guoqzuo'
      }
    }
  })
  new Profile().$mount('#mount-point');

  var app = new Vue({
    el: '#app',
    data: {
      name: '',
    }
  })
</script>

# 基础

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

# 选项合并

当组件和混入对象含有同名选项时,数据对象在内部会进行递归合并,并在发生冲突时以组件数据优先。

<script>
  var myMixin = {
    data: function() {
      return {
        foo: 1,
        test: 'hello'
      }
    },
    created: function() {
      this.hello();
    },
    methods: {
      hello: function() {
        console.log('hello from mixin')
      }
    }
  }
  var app = new Vue({
    mixins: [myMixin],
    el: "#app",
    data: {
      foo: 2,
      k: "greet"
    },
    created: function() {
      console.log('hello from vue实例');
    },
    methods: {
      showMsg: function() {
        console.log(this.$data) // { foo: 2, k: "greet", test: "hello"}
        this.hello(); // 调用混入对象的方法
      }
    }
  })
</script>

同名的钩子函数将合并为一个数组,都会被调用, 比如上面的例子中created钩子函数都会被调用

// hello from mixin
// hello from vue实例 
// 混入对象的钩子被调用,组件钩子被调用

值为对象的选项,如methods等,将被合并为同一个对象。两个对象键名冲突时,取组件对象的键值对。

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 实例。

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

new Vue({
  myOption: 'hello!'
})
// => "hello!"

# 自定义选项合并策略

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

Vue.config.optionMergeStrategies.myOption = function (toVal, fromVal) {
  // 返回合并后的值
}
上次更新: 2020/10/29 22:59:19