混入mixins
一、基础介绍
什么是mixins?
混入mixins:分发vue组件中可复用功能的灵活方式。
混入对象可以包含任意组件选项。
组件使用混入对象时,所有混入对象的选项将混入该组件本身的选项。
什么时候使用Mixins?
页面的风格不用,但是执行的方法和需要的数据类似,我们可以选择提取出公共部分,使用mixins。
二、使用规则
规则
- 选项合并:组件选项和对象选项同名时,将以恰当方式混合。
- 数据对象:和组件数据冲突时以组件数据优先。
- 同名钩子函数:混合为一个数组,都将被调用,混入对象钩子先调用。
- 值为对象选项:methods,components,将被混合为同一个对象,两对象键名冲突时,取组件对象的键值对。
合并(细化)
当组件和混入对象含有同名选项时,这些选项将以恰当的方式混合。
一、数据对象内
mixin的数据对象和组件的数据发生冲突时以组件数据优先。
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" }
}
})
二、值为对象的选项
值为对象的选项,如 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"
三、钩子函数
同名钩子函数将会混合为一个数组,都将被调用到,但是混入对象的钩子将在组件自身钩子之前调用。
var mixin = {
created: function () {
console.log('混入对象的钩子被调用')
}
}
new Vue({
mixins: [mixin],
created: function () {
console.log('组件钩子被调用')
}
})
// => "混入对象的钩子被调用"
// => "组件钩子被调用"
三、混入方式
混入方式:全局混入,组件混入
1. 组件混入(局部混入)
使用方式:
- 新建mixin.js文件
- 在mixin.js文件中,注册一个mixin对象,定义需要的方法或者数据,export该对象
- 在需要的页面引入并使用,混入
// 引入
import mixin from '@/assets/mixins/mixin.js'
// 混入
mixins: [mixin]
2. 全局混入
一旦使用全局混入对象,将会影响到 所有 之后创建的 Vue 实例。
使用方式:
- 在main.js中定义mixin(Vue.mixin)
- 在需要使用的页面直接使用,不需要再引入(使用方法同局部混入)
// 全局混入
Vue.mixin({
data() {
return {
name: 'dandan'
}
},
methods: {
hello() {
console.log('hello, 全局mixin')
}
}
})
四、一些比较
与vuex的区别
vuex:用来做状态管理的,里面定义的变量在每个组件中均可以使用和修改,在任一组件中修改此变量的值之后,其他组件中此变量的值也会随之修改。
Mixins:可以定义共用的变量,在每个组件中使用,引入组件中之后,各个变量是相互独立的,值的修改在组件中不会相互影响。
与公共组件的区别
组件:在父组件中引入组件,相当于在父组件中给出一片独立的空间供子组件使用,然后根据props来传值,但本质上两者是相对独立的。
Mixins:则是在引入组件之后与组件中的对象和方法进行合并,相当于扩展了父组件的对象与方法,可以理解为形成了一个新的组件。
五、总结
混合对于封装一小段想要复用的代码来讲是有用的。当然不是唯一可行的。混合很好,它不需要传递状态,但是这种模式当然也可能会被滥用。所以还是需要仔细斟酌使用。