vue中的mixin

vue中的mixin可以实现组件中重复代码的高度复用,可以将不同组件中重复的组件选项(如,data、created、mounted、components、computed、watch等)都提取出来,形成一个mixin的js文件,在需要用到这些代码时,引入这个js文件即可。

具体用法:
// mixin.js
export default {
 data() {
  return {
   name: 'mixin'
  }
 },
 created() {
  console.log('mixin...', this.name);
 },
 mounted() {},
 methods: {}
}

// 组件中
import mixin from './mixin.js'; // 引入mixin文件
export default {
 // mixins 是一个数组,可以引入多个mixin的js文件
 mixins: [mixin]
}
mixin的特点:
  • 组件引入一个mixin文件后,可以直接使用mixin文件中定义的任何变量、方法等,就像是在本组件内部定义的一样

  • mixin中的 data、provide 会和引用组件中的data合并,有冲突时,mixin中的data会被覆盖,以组件中定义的为准;若为对象,则进行深度合并(合并型合并

  • mixin中的函数(如watch和created、mounted等钩子函数)中的方法,不会产生覆盖,且mixin中的方法会在组件中的钩子函数之前调用(队列型合并

  • mixin中的对象(如props、methods、inject、computed等)中的值,在组件中若有同名的键名存在,则mixin中的会被覆盖,以组件中定义的为准(替换性合并

  • mixin中的 component、directives、filters 中的值,若组件中有同名的键名存在,则优先使用组件中的值;若组件中没有,则去mixin中寻找(叠加型合并

  • 若一个mixin文件被不同组件引用,mixin中的data中定义的数据,相对于每个引用它的组件来说,是独立的,即在A组件中改变了mixin中的变量a值,在B组件中a的值还是mixin中定义的初始值。

    注:
    	这也是mixin和vuex的区别,在vuex中定义的变量,在一个组件中改变了它的值,那么所有引用这个变量的地方,值都会同步改变。
    
  • 在组件中引入mixin之后,会将mixin中的选项都进行融入合并,对象中(如methods、computed)的值以组件中定义的为准,函数中(如watch、created)的值会和组件中的同时存在,mixin中的先被调用

    注:
    	所以,mixin和子组件的区别,就是,当父组件引入子组件时,它们还是相对独立的两个组件,通过props进行传值;当组件引入mixin时,会融合mixin中的选项值,相当于会形成一个新的组件。
    
mixin的缺点:
  • 命名冲突
  • 隐式依赖(mixin也可以使用组件中定义的属性,若组件中的属性名发生改变,那么不好检查出来,只有在运行时才会发现报错)
posted @ 2021-05-10 22:00  Upward123  阅读(694)  评论(0编辑  收藏  举报