前言: 如果写vue 组件的时候, 发现几个组件的逻辑差不多类似,就可以使用 vue 的mixin混入,把类似的逻辑抽离出来封住成js ,然后各个组件引入使用。
mixin就是用来解决vue组件逻辑复用的问题的。因为是针对js 逻辑的复用,所以一般都是js 文件。
// name.js
export default {
data () {
return {
name: 'mixin的name',
obj: {name:'mixin', value:'mixin'}
}
},
methods: {
getName () {
console.log('我是mixin,name:', this.name)
console.log('obj:', this.obj)
}
},
mounted () {
console.log('我是mixin的mounted')
this.getName()
}
}
它的用法和vue组件的用法是一样的。 比如钩子函数,methods的方法,data的数据等等。
然后在组件使用,通过mixins
选项即可引入。
import name from './name.js'
export default {
mixins: [name],
data () {
}
}
有时候会有个问题,组件内也定义了同样的钩子函数,同样的命名,同样的数据,该以哪个为准呢,是会覆盖还是合并呢?
import name from './name.js'
export default {
mixins: [name],
data () {
name: '组件的name',
obj: {name:'component'}
},
methods: {
getName () {
console.log('我是组件,name:', this.name)
console.log('obj:', this.obj)
}
},
mounted () {
console.log('我是组件的mounted')
this.getName()
}
}
// 结果:
我是mixin的mounted
我是组件,name: 组件的name
object:{}.....
通过以上结果可以得到,
钩子函数会合并起来,都会执行。先执行mixins的钩子函数再执行组件的钩子函数。
data 的 同名数据,要分情况讨论,
如果是基本类型,会用同名的数据覆盖mixin的数据
如果是对象,会递归对比key,如果同名key 会覆盖,不同名的key 会保留。
mounte的方法也是一样的,会用组件的方法覆盖mixin 的同名方法。
除了上面这些选项,还有比如components
(组件),和directives
(指令)等也是一样的逻辑,同名的会覆盖,以组件的为优先。
mixin 不好的地方, 是变量名不好找,不容易联想到是在mixin 中定义好的。会有这个是不是我没有定义,怎么只有使用的地方没有定义呢。小小的疑惑而已。