Vue -- Mixins 详解

115 阅读3分钟

最近在做页脚版权年份的自动更新,但项目里有多个地方都需要改动,了解到 Vue 里有 mixin 这个概念,发现可以很方便地抽取出来,进行组件化统一管理,下面介绍一下 mixin 的概念,特点和应用场景

介绍

官方解释:

混入 (mixin) 提供了一种非常灵活的方式,来分发 Vue 组件中的可复用功能。一个混入对象可以包含任意组件选项。当组件使用混入对象时,所有混入对象的选项将被“混合”进入该组件本身的选项。

个人理解:

mixin 是一种可复用的组件,操作简单,代码简洁,比公共组件要更加地 “共享”,不需要 props 传值,并且能合并 mixin 里的钩子函数

特点

  1. mixin 里 data() 的数据能合并到各组件中,但只会被当前组件所识别,并不会被共享

    大白话翻译:

    当前组件可以拿到 mixin 里的参数和对应的值,进行操作。但各组件中对这个值的操作不会互相影响,也不会影响到 mixin 里的原始值

  2. 值为对象的选项,如 methods,components 等,选项会被合并,键冲突的组件会覆盖混入对象的方法

    大白话翻译:

    mixin 组件和 当前组件的 methods,components 等会合并,但出现同名的优先当前组件的,会覆盖mixin 里的

  3. 值为函数的选项,如 created,mounted 等,就会被合并调用,混合对象里的钩子函数在组件里的钩子函数之前调用

    钩子函数合并,mixin 的执行顺序高于当前组件

与公共组件的区别

组件:在父组件中引入组件,相当于在父组件中给出一片独立的空间供子组件使用,然后根据props来传值,但本质上两者是相对独立的。

Mixins:则是在引入组件之后与组件中的对象和方法进行合并,相当于扩展了父组件的对象与方法,可以理解为形成了一个新的组件。

与vuex的区别

vuex:用来做状态管理的,里面定义的变量在每个组件中均可以使用和修改,在任一组件中修改此变量的值之后,其他组件中此变量的值也会随之修改。

Mixins:可以定义共用的变量,在每个组件中使用,引入组件中之后,各个变量是相互独立的,值的修改在组件中不会相互影响。

实际使用

以最近处理的页脚版权时间为例:

get-service-time-mixin.js

/**
 * @file 请求接口获取服务器时间 更新保存在store 转换成对应的年份 mixin
 */
export default {
  data() {
    return {
      currentYear: new Date().getFullYear(), //初始化当前年份currentYear 本地时间
    }
  },
  mounted() {
    this.setTime(); //调用 setTime
  },
  methods: {
    async setTime() {
      let serviceTime = Date.now();
      //触发请求服务器时间方法
      const { currentTime, status } = await this.$store.dispatch(
        'getServiceTime'
      );
      if (status === 'success') {
        serviceTime = currentTime;
      }
      //保存时间到 store
      this.$store.commit('setServiceTime', serviceTime);
      //根据服务器时间转换成对应的年份 赋值给currentYear
      this.currentYear = new Date(serviceTime).getFullYear();
    },
  },
}

该 mixin 组件里

  • 声明了 currentYear,并将请求后服务器时间转换成对应的年份,赋值给currentYear,引入该mixin 的组件都能识别 currentYear 并拿到其在该 mixin 里的值
  • 请求了服务器时间,并保存在 store 里,需要获取服务器时间的组件也可以引入该 mixin,在store.state 里取值

Copyright.vue

 <template>
  <section>
    <p>&copy;2013-{{currentYear}} xx有限公司版权所有</p>
  </section>
</template><script>
import getServiceTimeMixin from '~~/assets/mixins/get-service-time-mixin';
​
export default {
  //引入 mixin
  mixins: [getServiceTimeMixin],
}
</script>