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

vue中混合mixin的使用详解(以分页功能为例)

时间:2023-03-31 17:02:02 vue.js

什么是混合mixin首先说到混合mixin这个词,混合的概念不仅仅在vue中才有。其实在css预处理器less或者stylus或者scss中都有类似mixin的概念。只不过是通过css预处理器中的混合来实现样式的复用。vue中的mixedmixin是用来实现函数的复用的。lesspreprocessormixedmixin的使用步骤可以参考我之前的文章:https://segmentfault.com/a/11...官方文档关于如何定义mixedmixin是这样定义的。Mixin(混入)提供了一种非常灵活的方式来在Vue组件中分发可重用的功能。混合对象可以包含任意组件选项。当组件使用mixin时,mixin的所有选项都将“混合”到组件自己的选项中。乍一看,我说的不是很接地气,还是翻译成大白话吧。白话翻译混入(mixin)提供了一种非常灵活的混入函数的方式,以在Vue组件中分发可重用的函数。混合可以在.vue组件中重用的函数。想想复用的功能?比如后台管理系统中经常用到的分页功能,比如项目中很多地方都会用到的弹窗消息提示功能。其实有很多。本文以分页功能应用场景为例,说明一个混入对象可以包含任意组件选项。是混合对象吗?哇,传说中的面向对象的OOP思想,混合了一点继承。MixIncludeArbitraryComponents选项?组件选项不就是data、computed、watch、methods和各种生命周期钩子吗,也就是说,这些组件选项也可以像在组件中一样定义在mix中,供'mix-in'使用。当一个组件使用一个mix-in对象时,所有mix-in对象的选项都会被“混合”到组件本身的选项中。在vue中使用一个'东西',一般的套路大致是定义-->引入-->注册-->使用。由于mix是在某个.vue中使用的,引入之后,就相当于在mix中拥有了一些东西。实际使用步骤(混合分页组件)来看看最终效果图吧。假设我们的项目中有两个路由页面使用了分页组件。分页通常与表格结合使用。为了方便和简单,我们不会在这里放表格。.我们需要使用mixin来实现这样的分页效果。第一步新建一个项目App.vue文件,放置相应的路由导航和视图结构//App.vue文件定义importVuefrom'vue'importVueRouterfrom'vue-router'Vue.use(VueRouter)constrouter=newVueRouter({routes:[{路径:"/",组件:resolve=>require(['../views/home.vue'],resolve),},{path:"/about",组件:resolve=>require(['../views/about.vue'],resolve),},]})exportdefaultrouterhome.vue和about.vue使用饿了么UI的分页组件(about.vue文件不会放,结构基本一样)在本例中,两个路由页面的分页效果已经实现,但是还没有使用mixin。本例中,因为home.vue和about.vue文件都有分页功能,要使用分页功能,需要定义第一页的pageIndex,每页显示的pageSize个数,总个数items,翻页方法改变handleCurrentChange,方法handleSizeChange改变这些变量和方法的个数。这些变量和方法是公共的复用代码,因为它们可能会在很多地方使用,我们可以把这些复用的放在混合文件中,混入到需要用到的地方。第二步(定义一个mixin文件并暴露出来)第三步(引入混合注册和使用混合)首先删除原来写入的数据中的分页变量和methods中的分页方法。当然删除了会报错,因为分页组件需要这些变量和方法,所以接下来我们使用混入的变量和方法来介绍使用另外一个about.vue文件也可以用同样的方法处理,就可以实现想要的功能。篇幅有限就不细说了。补充1(看具体导入的mix)其实可以换个角度理解,即mix就是将mix文件中定义的变量方法挂载到具体的.vue文件中,也就是挂载到具体的vue示例,所以打印这个vue示例的时候可以看到挂载的mixin代码,如下:打印结果为如下:很明显,mix中的变量和方法都已经挂载到这个vue组件实例上了。既然都挂载在了这个例子上,那么就意味着在模板中html代码中是可以使用的,所以使用mixin确实可以让我们的代码写的更优雅补充2(mixin代码和组件代码冲突怎么办)首先总之,mixin中定义的代码不要重复,也不要和组件中的代码相同其次,以组件中的为准。简而言之,组件中没有的东西在混合中,所以混合;component里有东西,mix里也有,不要mix了,component里只保留supplement3(全局mixin,一般不用)上面代码案例我们用的是localmixin,其实挺方便的。哪里需要用到,我们就可以引入mixin。使用全局混合虽然省去了引入注册的步骤,但是全局混合中定义的变量和方法都会挂载到每个组件上,这样不是很好。毕竟官方也提醒我们在使用globalmixins的时候一定要格外小心。总结mixinVSvuex使用vuex也可以管理状态。和mixin不同的是,一旦vuex中的数据发生变化,vuex中所有相关的依赖都会发生变化,但是使用mixin,却出现了这种情况。毕竟vuex是public的,mixin是独立的