当前位置: 首页 > Web前端 > vue.js

VueMixins简介

时间:2023-03-31 19:32:12 vue.js

Mixins(混入)是一种非常灵活的在Vue组件中分配可重用功能的方式。Mixin可以包含任意组件选项。当组件使用mixin时,mixin的所有选项都会混合到组件本身的选项中。//定义一个mixin对象varmyMixin={created:function(){this.hello()},methods:{hello:function(){console.log('hellofrommixin!')}}}//定义一个使用mixins的组件varComponent=Vue.extend({mixins:[myMixin]})varcomponent=newComponent()//=>"hellofrommixin!"optionmerge当component和mixin有同名的options时,这些Options将以适当的方式混合。例如,数据对象内部会进行浅合并(一层属性深度),当与组件数据发生冲突时,组件数据优先。varmixin={data:function(){return{message:'hello',foo:'abc'}}}newVue({mixins:[mixin],data:function(){return{message:'goodbye',bar:'def'}},created:function(){console.log(this.$data)//=>{message:"goodbye",foo:"abc",bar:"def"}}})相同name钩子函数将被混合到一个数组中,因此将被调用。此外,mixin对象的钩子将在组件自己的钩子之前被调用。varmixin={created:function(){console.log('mixinobjecthook被调用')}}newVue({mixins:[mixin],created:function(){console.log('组件hook被调用')}})//=>"调用混入对象的钩子"//=>"调用组件钩子"值为对象的选项,如方法、组件和指令,将被混入同一个目的。当两个对象的键名冲突时,取组件对象的键值对。varmixin={方法:{foo:function(){console.日志('foo')},冲突:函数(){控制台。log('frommixin')}}}varvm=newVue({mixins:[mixin],methods:{bar:function(){console.log('bar')},conflicting:function(){控制台。日志('来自自我')}}})虚拟机。foo()//=>"foo"vm.bar()//=>"bar"vm.conflicting()//=>"fromself"注意:Vue.extend()也使用相同的合并策略。全局mixins也可以全局注册mixin对象。使用要注意!一旦使用全局mixin,它会影响之后创建的所有Vue实例。如果使用得当,自定义对象可以注入处理逻辑。//为自定义选项“myOption”注入处理程序。Vue.mixin({created:function(){varmyOption=this.$options.myOptionif(myOption){console.log(myOption)}}})newVue({myOption:'hello!'})//=>“你好!”注意:谨慎使用全局mixin对象,因为它会影响每个单独创建的Vue实例(包括第三方模板)。大多数时候,它应该只应用于自定义选项,如上面的示例。它也可以用作插件以避免重复应用。自定义选项合并策略自定义选项将使用默认策略,它只是覆盖现有值。如果你想让自定义选项与自定义逻辑合并,你可以在Vue.config.optionMergeStrategies中添加一个函数:Vue.config.optionMergeStrategies.myOption=function(toVal,fromVal){//returnmergedVal}对于大多数对象选项,你可以MergeStrategies使用方法:varstrategies=Vue.config.optionMergeStrategiesstrategies.myOption=strategies.methods更多高级示例可以在Vuex1.xmixinstrategies中找到:constmerge=Vue.config.optionMergeStrategies.computedVue.config。optionMergeStrategies.vuex=function(toVal,fromVal){if(!toVal)returnfromValif(!fromVal)returntoValreturn{getters:merge(toVal.getters,fromVal.getters),state:merge(toVal.state,fromVal.状态),动作:合并(toVal.actions,fromVal.actions)}