vue中mixin的使用

257 阅读1分钟

1. 理解

Mixin对象分发 Vue 组件中的可复用功能。
mixin 的本质就是一个 JS 对象,它可以有 data、created、methods 等等 vue 实例中拥有的所有属性,甚至可以在 mixins 中再次嵌套 mixins
这有点像注册了一个 vue 公共方法,可以在多个组件中使用。还有一点类似于在原型对象中注册方法,并且可以定义相同函数名的方法进行覆盖

2. 使用场景

多个组件中都用到了一些公用的方法、数据时。
有两个非常相似的组件,他们的基本功能是一样的,但他们之间又存在着足够的差异性。把它拆分成两个不同的组件呢?把它拆分成两个不同的组件呢? 如果拆分成两个组件,你就不得不冒着一旦功能变动就要在两个文件中更新代码的风险,这违背了 DRY 原则。 反之,太多的props传值会很快变得混乱不堪,从而迫使维护者(即便这个人是你)在使用组件的时候必须理解一大段的上下文,拖慢写码速度。

3. 相关代码

新建Mixin.vue组件
<template>
  <div></div>
</template>

<script>

export default {
  name: 'MixinsTestMain',
  components: {},
  props: {},
  data () {
    return {
      mixinData: 'mixin中的变量'
    }
  },
  computed: {},
  mounted () {
  },
  methods: {
    mixinFunction () {
      return '我是mixins里面的公共方法'
    }
  }
}
</script>

<style scoped>
</style>


// 页面中局部混入
<template>
  <div class="about">
    <el-button
      type="info"
      @click="handleMixin"
    >
      Info
    </el-button>
  </div>
</template>
<script>
// 首先导入Mixinvue
import Mixin from '@/views/test/Mixin.vue'
import {
  getCurrentInstance
} from 'vue'
export default ({
  name: 'About',
  components: {
  },
  // 局部混入
  mixins: [Mixin],
  setup () {
    const { proxy } = getCurrentInstance()
    console.log('this proxy', proxy)

    const handleMixin = () => {
      console.log('mixinData', proxy.mixinData)
      const mixfun = proxy.mixinFunction()
      console.log('mixinData', mixfun)
    }
    return {
      handleMixin
    }
  }
})

// 全局混入 【Mixin 也可以进行全局注册。使用时格外小心!一旦使用全局 mixin,它将影响**每一个**之后创建的组件 (例如,每个子组件)】
// 新建 Mixin.vue 组件同上
// 新建 Mixin.js文件
import mixin from '@/views/test/Mixin.vue'
export default {
  mixins: [mixin]
}
// 在mian.js中配置如下
// 1. 首先引入Mixin.js组件
import mixin from './views/test/Mixin'
const app = createApp(App)
app.mixin(mixin)
</script>

4. 注意:

Mixin全局注册。可能会造成数据污染,推荐布局引入方式。
当组件和 mixin 对象含有同名选项时,以当前自身组件数据优先。

参考链接:

juejin.cn/post/699916…

juejin.cn/post/695570…