详解Vue的mixin策略
我之前一直以为mixin的合并是以组件内的优先,即mixin的内容如果和组件内有冲突的,以组件内为准,确实存在这种情况,但是vue指定的策略更详细,下面分别记录各种情况对应的合并策略
基本
当一个组件使用mixin的时候,所有mixin的选项会被混入到组件自己的选项中,这部分没什么好说的,直接看代码
//defineamixinobject
constmyMixin={
created(){
this.hello()
},
methods:{
hello(){
console.log('hellofrommixin!')
}
}
}
//defineanappthatusesthismixin
constapp=Vue.createApp({
mixins:[myMixin]
})
app.mount('#mixins-basic')//=>"hellofrommixin!"
选项的合并策略
这里的选项指的就是datamethods和生命周期钩子函数这些选项,他们的会采取不同的合并策略
像data,methods,components,directives这样的会被合并进同一个对象中,并且遇到冲突项以组件的为准
constmyMixin={
data(){
return{
message:'hello',
foo:'abc'
}
}
}
constapp=Vue.createApp({
mixins:[myMixin],
data(){
return{
message:'goodbye',
bar:'def'
}
},
created(){
console.log(this.$data)//=>{message:"goodbye",foo:"abc",bar:"def"}
}
})
constmyMixin={
methods:{
foo(){
console.log('foo')
},
conflicting(){
console.log('frommixin')
}
}
}
constapp=Vue.createApp({
mixins:[myMixin],
methods:{
bar(){
console.log('bar')
},
conflicting(){
console.log('fromself')
}
}
})
constvm=app.mount('#mixins-basic')
vm.foo()//=>"foo"
vm.bar()//=>"bar"
vm.conflicting()//=>"fromself"
而对于钩子函数就不是简单的替换了,如果有同名的,他们会被一起合并进数组中,然后依次调用,且mixin的钩子函数会率先被调用
constmyMixin={
created(){
console.log('mixinhookcalled')
}
}
constapp=Vue.createApp({
mixins:[myMixin],
created(){
console.log('componenthookcalled')
}
})
//=>"mixinhookcalled"
//=>"componenthookcalled"
全局混入和自定义选项
constapp=Vue.createApp({
myOption:'hello!'
})
//injectahandlerfor`myOption`customoption
app.mixin({
created(){
constmyOption=this.$options.myOption
if(myOption){
console.log(myOption)
}
}
})
app.mount('#mixins-global')//=>"hello!"
上述代码,我们在全局创建了一个自定义选项,然后进行了全局混入处理,但是需要注意的是,这会影响到这个app所有的子组件:
constapp=Vue.createApp({
myOption:'hello!'
})
//injectahandlerfor`myOption`customoption
app.mixin({
created(){
constmyOption=this.$options.myOption
if(myOption){
console.log(myOption)
}
}
})
//addmyOptionalsotochildcomponent
app.component('test-component',{
myOption:'hellofromcomponent!'
})
app.mount('#mixins-global')
//=>"hello!"
//=>"hellofromcomponent!"
我们可以看到,对于自定义选项这不是简单的替换,而是分别调用,当然我们也可以制定我们自己的合并策略:
constapp=Vue.createApp({})
app.config.optionMergeStrategies.customOption=(toVal,fromVal)=>{
//returnmergedVal
}
合并策略接收两个参数,分别是指定项在父实例和子实例的值,当使用mixin的时候我们可以查看打印什么:
constapp=Vue.createApp({
custom:'hello!'
})
app.config.optionMergeStrategies.custom=(toVal,fromVal)=>{
console.log(fromVal,toVal)
//=>"goodbye!",undefined
//=>"hello","goodbye!"
returnfromVal||toVal
}
app.mixin({
custom:'goodbye!',
created(){
console.log(this.$options.custom)//=>"hello!"
}
})
可以看到第一次从mixin打印,然后从app打印。
注意事项
- mixin很容易造成冲突,你得确保不会有冲突的属性名,来避免冲突,这会造成额外的负担
- 复用性有限,因为mixin不能接受参数,所以逻辑是写定的,不灵活
所以官方推荐使用CompositionApi来组织逻辑
以上就是详解Vue的mixin策略的详细内容,更多关于Vue的mixin策略的资料请关注毛票票其它相关文章!