QQ咨询 官方微信

添加微信好友

官方小程序

百度小程序

微信小程序

头条小程序

关于我们

vue教程

Vue中mixins(混入)的介绍和使用

 shitouadmin  2023-07-28 08:31:58
当我们的项目越来越庞大,项目中的某些组件之间可能会存在一些相似的功能,这就导致了在各个组件中需要编写功能相同的代码段,重复地定义这些相同的属性和方法,导致代码地冗余,还不利于后期代码的维护。
一、什么是Mixins
mixins(混入),官方的描述是一种分发 Vue 组件中可复用功能的非常灵活的方式,mixins 是一个 js 对象,它可以包含我们组件中 script 项中的任意功能选项,如:data、components、methods、created、computed 等等。我们只要将公用的功能以对象的方式传入 mixins 选项中,当组件使用 mixins 对象时所有 mixins 对象的选项都将被混入该组件本身的选项中来,这样就可以提高代码的重用性,并易于后期的代码维护。
 
二、何时使用Mixins
当我们存在多个组件中的数据或者功能很相近时,我们就可以利用 mixins 将公共部分提取出来,通过 mixins 封装函数,组件调用他们是不会改变函数作用域外部的。
 
三、如何创建Mixins
在 src 目录下创建一个 mixins 文件夹,在文件夹下新建一个 myMixins,js 文件。因为 mixins 是一个 js 对象,所以应该以对象的形式来定义 myMixins,在对象中可以和 vue 组件一样来定义 data、components、methods、created、computed 等属性,并通过 export 导出该对象。
也可以在 views 文件夹某个页面文件下创建 mixins 文件夹。(一切视设实际情况而定)
 
四、如何使用Mixins
在需要调用的组件中引入 myMixins,js 文件,然后在 export default 中引入需要的对象即可。
 
五、Mixins的特点
5.1 方法和参数在各组件中不共享
虽然组件调用了 mixins 并将其属性合并到自身组件中来了,但是其属性只会被当前组件所识别并不会共享,也就是其他组件无法从当前组件中获取到 mixins 中的数据和方法。
 
①首先在 myMixins,js 中定义一个 age 字段和 getAge 方法
  1. export const myMixins = { 
  2.   components:{}, 
  3.   data() { 
  4.     return { 
  5.       age: 18, 
  6.     } 
  7.   }, 
  8.   mounted() { 
  9.     this.getAge() 
  10.   }, 
  11.   methods: { 
  12.     getAge() { 
  13.       console.log(this.age) 
  14.     } 
  15.   } 
②组件1中对 num 进行 +1 操作
 
  1. import { myMixins } from "@/mixins/myMixins.js"
  2. export default { 
  3.   mixins: [myMixins], 
  4.   data() { 
  5.     return {} 
  6.   }, 
  7.   created() { 
  8.     this.age++ 
  9.   }, 
③组件2不进行操作
 
  1. export default { 
  2.   mixins: [myMixins], 
  3.   data() { 
  4.     return {} 
  5.   }, 
④我们分别切换到两个页面,查看控制台输出。会发现组件1改变了age里面的值,组件2中age值还是混合对象的初始值,并没有随着组件1的增加而改变
 
5.2 Mixins 合并冲突
5.2.1 值为对象 合并冲突
值为对象(components、methods 、computed、data)的选项,混入组件时选项会被合并,键冲突时优先组件,组件中的键会覆盖混入对象的。
 
①我们在混入对象增加age属性、getAge1方法和getAge2方法
  1. export const myMixins = { 
  2.   components:{}, 
  3.   data() { 
  4.     return { 
  5.       age: 18, 
  6.     } 
  7.   }, 
  8.   methods: { 
  9.     getAge1() { 
  10.       console.log("age1 from mixins ="this.age ) 
  11.     }, 
  12.     getAge2() { 
  13.       console.log("age2 from mixins ="this.age ) 
  14.     }, 
  15.   } 
②我们在引入了myMixins文件的组件中,增加age属性、getAge1方法和getAge3方法
  1. // template.vue 
  2. import { myMixins } from "@/mixins/myMixins.js"
  3. export default { 
  4.   mixins: [myMixins], 
  5.   data() { 
  6.     return { 
  7.       age: 20, 
  8.     } 
  9.   }, 
  10.   mounted() { 
  11.     this.getAge1(); 
  12.     this.getAge2(); 
  13.     this.getAge3(); 
  14.   }, 
  15.   methods: { 
  16.     getAge1() { 
  17.       console.log('age1 from template ='this.age) 
  18.     }, 
  19.     getAge3() { 
  20.       console.log('age3 from template ='this.age) 
  21.     }, 
  22.   } 
③我们会发现,组件中的age覆盖了混合对象的age,组件的getAge1方法覆盖了混合对象的getAge1方法
 
5.2.2 值为函数 合并冲突
值为函数(created、mounted)的选项,混入组件时选项会被合并调用,混合对象里的钩子函数在组件里的钩子函数之前调用。
  1. // myMixins.js 
  2. export const myMixins = { 
  3.   components:{}, 
  4.   data() { 
  5.     return {} 
  6.   }, 
  7.   created() { 
  8.     console.log('xxx from mixins'
  9.   } 
  1. import { myMixins } from "@/mixins/myMixins.js"
  2. export default { 
  3.   mixins: [myMixins], 
  4.   data() { 
  5.     return {} 
  6.   }, 
  7.   created() { 
  8.     console.log('xxx from template'
  9.   } 
六、mixins 中有异步请求的情况
问题描述: 当混合里面包含异步请求函数,而我们又需要在组件中使用异步请求函数的返回值时,我们会取不到此返回值。如下:
Mymixins.js 文件中:
  1. // myMixins.js 
  2. export const myMixins = { 
  3.   components:{}, 
  4.   data() { 
  5.     return { 
  6.       num: 1, 
  7.     } 
  8.   }, 
  9.   methods: { 
  10.     getDate1() { 
  11.   new Promise((resolve,reject) => { 
  12.       let a = 1; 
  13.       setTimeout(() => { 
  14.         resolve(a) 
  15.       },500) 
  16.     }).then(res => { 
  17.       console.log(res,'res'); 
  18.       return res 
  19.   }) 
  20.     }, 
  21.   } 
todo.vue 文件中:
  1. // todo.vue 
  2. import { myMixins } from "./myMixins.js"
  3.  
  4. export default { 
  5.   mixins: [myMixins], 
  6.   data() { 
  7.     return {} 
  8.   }, 
  9.   mounted() { 
  10.     console.log(this.getDate1,'template1-func_one'
  11.   } 
打印结果:
 
解决方案:不要返回结果,而是直接返回异步函数
Mymixins:
  1. // myMixins.js 
  2. export const myMixins = { 
  3.   components:{}, 
  4.   data() { 
  5.     return { 
  6.       num: 1, 
  7.     } 
  8.   }, 
  9.   methods: { 
  10.    async getDate1() { 
  11.   let result = await new Promise((resolve,reject) => { 
  12.       let a = 1; 
  13.       setTimeout(() => { 
  14.         resolve(1) 
  15.       },500) 
  16.    }) 
  17.    return result 
  18.     }, 
  19.   } 
todo.vue 文件中:
  1. // todo.vue 
  2. import { myMixins } from "./myMixins.js"
  3.  
  4. export default { 
  5.   mixins: [myMixins], 
  6.   data() { 
  7.     return {} 
  8.   }, 
  9.   mounted() { 
  10.     this.getDate1().then(res => { 
  11.       console.log(res,'template1-res'
  12.     }) 
  13.   } 
打印结果:
 
七、与 vuex 的区别
vuex: 用来做状态管理的,里面定义的变量在每个组件中均可以使用和修改,在任一组件中修改此变量的值之后,其他组件中此变量的值也会随之修改。
 
Mixins: 可以定义共用的变量,在每个组件中使用,引用组件中之后,各个变量是相互独立的,值的修改在组件中不会相互影响。
 
八、与公共组件的区别
组件: 在父组件中引入组件,相当于在父组件中给出一片独立的空间供子组件使用,然后根据 prop 来传值,但本质上两者是相对独立的。
 
Mixins: 在引入组件之后与组件中的对象和方法进行合并,相当于扩展了父组件的对象与方法,可以理解为形成了一个新的组件。
 
版权声明:本文为CSDN博主「Share_Li_98」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Share_Li_98/article/details/125987983
¥ 打赏
×
如果您觉得文章帮助了您就打赏一下吧
非常感谢你的打赏,我们将继续分享更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫打赏

微信扫一扫打赏

本文《Vue中mixins(混入)的介绍和使用》发布于石头博客文章,作者:shitouadmin,如若转载,请注明出处:https://www.pweb123.com/frame/vue/973.html,否则禁止转载,谢谢配合!

文章点评

我来说两句 已有0条评论
点击图片更换

添加微信好友

添加微信好友

微信小程序

百度小程序