混入 (mixin) 提供了一种非常灵活的方式,来分发 Vue 组件中的可复用功能。
数据对象在内部会进行递归合并,并在发生冲突时以组件数据优先。
同名钩子函数将合并为一个数组,都将被调用。混入对象的钩子先调用,组件定义钩子后调用。
值为对象的选项,例如 methods、components 和 directives,将被合并为同一个对象。两个对象键名冲突时,取组件对象的键值对。
混入发生在生命周期初始化等等之前,作为options合并,合并后才开始其它的初始化,所有混入不影响data等等监听和响应, 也不会出现因为引入同一mixin出现共享属性的情况。
混入方式
局部混入
在组件中引入一个混入对象,通过组件的mixins绑定
export const mixin={
data(){
return {
number:1
}
}
}
//组件
import {mixin} from "xxx/mixin" export default {
data(){
return {
} },
mixins:[mixin],
...
} </script>
全局引入
通过Vue.mixin(混入对象)
Vue.mixin({
created: function () {
console.log('global mixin created')
}
})
选项合并
混入属性
- 混入属性的定义方式跟Vue实例定义属性的方式一样data(){return{xxx}}
- 当混入对象定义属性组件中未定义,混入后组件可使用此属性
- 当组件和混入对象定义同名属性,混入后使用组件定义的属性,忽略混入
export const mixin={
data(){
return {
number:1
}
}
}
选择使用mixin的组件,如果没有number属性,混入后可以使用number属性;如果有number属性,混入后被过滤掉,以组件定义的number属性为主
混入自定义方法
- 混入方法的定义方式跟Vue实例定义方法的方式一样methods:{ func() {}}
- 当混入对象定义方法组件中未定义,混入后组件可使用此方法
- 当组件和混入对象定义同名方法,混入后使用组件定义的方法,忽略混入
//mixin
export const mixin={ methods:{ func(){ console.log("mixin func") } } }
// 组件
import {mixin} from "xxx/mixin"
export default {
mixins:[mixin],
mounted(){
this.func();
},
methods:{
func(){
console.log("component func");
}
}
}
</script>
当组件和混入对象定义同名方法:组件挂载后,执行this.func(), 控制台只会打印出 "component func",混入的func方法被忽略。
混入生命周期钩子
- 同名钩子函数将合并为一个数组,因此都【将被调用】。
- 【混入对象的钩子】先执行,再到组件同名的钩子执行。
export const mixin={
created(){
console.log("mixin created")
}
}
// 组件
<script>
import {mixin} from "xxx/mixin"
export default {
mixins:[mixin],
created(){
console.log("component created");
}
}
</script>
当组件和混入对象定义同名生命周期钩子: 组件实例化后,同名钩子,混入对象定义执行后,组件定义的接着执行。以上代码控制台会先打印:
mixin created component created