Skip to main content

api-vue2mixin-vue3替代方式

vue2中的mixin

mixin 是一种可重用的 Vue 组件选项,它可以包含任意组件选项,如 data、methods、computed、生命周期钩子等。我们可以将 mixin 引入到一个组件中,以将 mixin 中的选项混合到组件选项中,从而实现代码复用

下面例子创建了一个名为 myMixin 的 mixin 对象,它包含了 data、created 和 methods 三个选项。

然后,在 MyComponent.vue 组件中引入 myMixin 并在 mixins 选项中使用它,这样就可以将 myMixin 中的选项混入到 MyComponent.vue 组件中。在这个例子中,MyComponent.vue 组件将具有 myMixin 中定义的 data、methods 和 created 钩子。

需要注意的是,如果 mixin 和组件选项中存在同名选项,Vue.js 会自动合并它们,组件选项优先。例如,如果 myMixin 和 MyComponent.vue 组件都有 data 选项,最终的 data 选项将是两者合并的结果。如果混合的选项是生命周期钩子函数,则它们将按照创建顺序依次调用。

另外,我们还可以使用 mixin 的方式来扩展路由守卫。例如,如果我们需要在多个组件中都使用相同的 beforeRouteEnter 钩子,我们可以将它定义为一个 mixin,然后在需要使用它的组件中引入该 mixin

步骤1-创建一个 mixin 对象,定义需要混入的选项

// myMixin.js
export default {
data() {
return {
message: 'Hello, world!'
}
},

created() {
console.log('myMixin created')
},

methods: {
showMessage() {
alert(this.message)
}
}
}

在需要使用 mixin 的组件中引入该 mixin,并在 mixins 选项中使用它:

MyComponent.vue

<template>
<div>
<p>{{ message }}</p>
<button @click="showMessage">Show Message</button>
</div>
</template>

<script>
import myMixin from './myMixin'

export default {
mixins: [myMixin],

created() {
console.log('MyComponent created')
}
}
</script>

vue3中mixin的替代方式

Vue 3 的 mixin 采用了一种新的 API,即 Composition API,这也是 Vue 3 新增的一个特性。

Composition API 是一种基于函数的 API,它允许我们在逻辑上组织代码,而不是按照生命周期方法和选项对象来组织代码。与 Vue 2 的 mixin 不同,Composition API 允许我们将逻辑代码封装到单个函数中,然后在多个组件中复用该函数,而不是像 mixin 一样将多个选项混合在一起。

步骤1

// myMixin.js
import { reactive, onMounted } from 'vue'

export default function() {
const state = reactive({
message: 'Hello, world!'
})

onMounted(() => {
console.log('myMixin created')
})

function showMessage() {
alert(state.message)
}

return {
state,
showMessage
}
}

步骤2-在组件中使用该 mixin

在上面的示例中,我们在 setup 函数中使用 myMixin 函数来创建一个 mixin 对象,并返回 state 和 showMessage 属性。然后,在组件中使用 state 和 showMessage 来实现相应的功能。

MyComponent.vue

<template>
<div>
<p>{{ state.message }}</p>
<button @click="showMessage">Show Message</button>
</div>
</template>

<script>
import myMixin from './myMixin'

export default {
setup() {
const { state, showMessage } = myMixin()

return {
state,
showMessage
}
},

mounted() {
console.log('MyComponent created')
}
}
</script>