一、Vue2中的mixin

1、定义要混入的数据对象

// 定义一个 mixin 对象
export const myMixin = {
  created() {
    this.hello()
  },
  methods: {
    hello() {
      console.log('hello from mixin!')
    }
  }
}

2、在需要这些东西的地方去通过mixins获得mixin对象

<template>
  <div>
    <h1>我是页面1</h1>
    <h2>hello:{{ hello }}</h2>
  </div>
</template>
<script>
import { myMixin } from '@/mixin/test1.js'
export default {
  mixins: [myMixin],
}
</script>
<style></style>

3、解决的问题(说作用可能更准确点)

vue2.x中,mixin是将部分组件逻辑抽象成可重用块的工具,也就是重要的“复用”

4、存在的问题

mixin很容易发生冲突:因为mixin中的property都被合并到了一个组件中,同名的会被覆盖,需要了解每一个选项默认的合并特性

数据来源不明确:如果你引入了多个mixin对象,那你想要知道其中一个具体方法、属性等的来源无疑是很难查找的

可重用性有限:我们只能被动的使用mixin中传递的任何东西,而不能通过参数传递的方式来改变其中的某些逻辑,这大大降低了它抽象逻辑方面的灵活性

5、vue2中mixin详解

请参考:Vue混入mixin_你吃香蕉吗?的博客-CSDN博客

二、Vue3中有mixin吗?需要mixin吗?

1、结论:vue3中没有mixin,也不需要mixin

2、vue3中没有mixin?

如果大家在这之前看过vue3的官方文档,那么大家就会发现,在vue3的文档中提到mixin的地方极少无比,所能找到的地方也只是在说vue2的一些写法之类的,那既然没写mixin,大概率就在vue3中没有mixin了,接下来我们会肯定它没有mixin。

官方很重要的一段话:为了解决Vue2存在的问题,我们添加了一种通过逻辑关注点组织代码的新方法:组合式 API。

3、vue3不需要mixin?

vue3相比较vue2来说,它更加的接近函数式编程,说白了就是写js,用写js的方式方法来写页面

提到这里我想大家应该能够想到一个关键词:公共

而上面所说也就是组合式API——Composition API

在Composition API中,我们可以抽离出每一个逻辑点为单独的js文件,再通过import的方式去把页面的所有内容组合在一起,实现一个完整的页面。

同样的,如果多个页面、组件,用到的方法、变量都是同样的,那么我们可以把这一个js文件同时引入到多个文件中,然后再进行使用,这也就达到了mixin的效果,甚至我们可以通过接受参数的方式对公共的方法作出定制化处理

三、Vue3中“Mixin”的实践

1、目录结构

Vue3:探讨一下mixin

 2、index.vue

<template>
  <A></A>
  <B></B>
</template>
<script setup lang="ts">
import A from './A.vue'
import B from './B.vue'
</script>

3、homeMixin.ts

export default function getHomeMixin(source: string) {
	let name = ref<string>('张三');
	const componentName = source
	const handleChangeName = (transmitName: string) => {
		name.value = transmitName
	}
	return {
		name,
		componentName,
		handleChangeName
	}
}

4、A、B组件

A组件

<template>
  <div class="A">
    <p>A组件</p>
    <p>minxin:{{ Mixin.name }}</p>
    <p>{{ Mixin.componentName }}</p>
    <el-button @click="Mixin.handleChangeName('法外狂徒-张三')">A组件改变mixin中得到的数据</el-button>
  </div>
</template>
<script setup lang="ts">
import getHomeMixin from './homeMixin'
const Mixin = getHomeMixin('我是A组件传的值');
</script>
<style lang="less" scoped>
.A {
  width: 300px;
  height: 300px;
  background-color: aquamarine;
}
</style>

B组件

<template>
  <div class="B">
    <p>B组件</p>
    <p>minxin:{{ Mixin.name }}</p>
    <p>{{ Mixin.componentName }}</p>
    <el-button @click="Mixin.handleChangeName('尼古拉斯-赵四')">B组件改变mixin中得到的数据</el-button>
  </div>
</template>
<script setup lang="ts">
import getHomeMixin from './homeMixin'
const Mixin = getHomeMixin('我是B组件传的值');
</script>
<style lang="less" scoped>
.B {
  width: 300px;
  height: 300px;
  background-color: burlywood;
}
</style>

5、效果

Vue3:探讨一下mixin