mixin
详细过程参见vue官网
1. mixin基本使用
混入可以实现vue组件功能的可复用性
一个混入对象可以包含任意组件选项,比如说vue组件中有的options选项,混入对象中都可以有,如生命周期钩子函数、methods、data、计算属性等。
// 定义一个混入对象
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!"
2. 选项合并
针对data数据合并问题:组件和混入对象采取递归合并,并且同名冲突时,采取组件的的数据属性优先
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" }
}
})
针对钩子函数合并问题:组件和混入对象的钩子函数会被合并成一个数组,都会调用;同名的钩子函数冲突时,混入对象的钩子函数优先于组件的钩子函数调用。
var mixin = {
created: function () {
console.log('混入对象的钩子被调用')
}
}
new Vue({
mixins: [mixin],
created: function () {
console.log('组件钩子被调用')
}
})
// => "混入对象的钩子被调用"
// => "组件钩子被调用"
针对options属性值为对象的问题:(例如 methods、components 和 directives) 两个属性值对象将被合并为同一个对象。当两个对象中的键名冲突时,取组件对象的键值对
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"
3. 全局混入和局部混入
混入也可以进行全局注册。使用时格外小心!一旦使用全局混入,它将影响每一个之后创建的 Vue 实例(包括第三方组件)。使用恰当时,这可以用来为自定义选项注入处理逻辑
// 示例:全局混入
// 为自定义的选项 'myOption' 注入一个处理器。
Vue.mixin({
created: function () {
var myOption = this.$options.myOption
if (myOption) {
console.log(myOption)
}
}
})
new Vue({
myOption: 'hello!'
})
// => "hello!"
// 示例:局部混入:单独定义mixin对象,然后作为vue属性mixins的值
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!"