vue3中mixin的使用方法

本文介绍了在Vue2到Vue3迁移项目中,如何从使用mixins转向Vue3的组合式API来管理和复用组件逻辑,包括创建mixin、使用mixin以及处理传值的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在 Vue 2 中,mixins 是创建可重用组件逻辑的主要方式。尽管在 Vue 3 中保留了 mixins 支持,但对于组件间的逻辑复用,使用组合式 API 的组合式函数是现在更推荐的方式。

最近在vue2迁移到vue3的项目中,对mixin的使用进行了改造,介绍一下使用方法。

1、创建mixin

新建一个user.js文件,写入要mixin的方法和数据,示例代码如下。

import {
  ref,
  watch,
  onMounted
} from 'vue'
export default function () {
  const mData = ref(null)
  onMounted(() => {
    getData()
  })
  watch(() => data, (newVal, oldVal) => {
    console.log('watch', newVal, oldVal)
  }, {
    deep: true
  })
  const getData = () => {
    mData.value = {
        name: 'lily',
        age: 10
    }
  }

  // 暴露出去
  return {
    mData,
    getData
  }
}

2、使用mixin

在需要使用mixin的组件中,导入user.js。

<template>
    <div class="box">
        {{mData.name}}
    </div>
</template>

<script setup>
import { ref} from 'vue'
// 导入
import userMix from "@/common/mixins/user";
// 拿到数据
const { mData } = userMix();
console.log(mData)

</script>
<style lang="scss" scoped>
</style>

3、给mixin传值

如果mixin中的方法依赖组件中的传值时,在调用userMix()时,可以传递参数

改造一下之前的代码,(可能没什么逻辑,仅做示例):

user.js的代码:

import {
  ref,
  watch,
  onMounted
} from 'vue'
export default function (userData) {
  const mData = ref(null)
  onMounted(() => {
    getData()
  })
  watch(() => data, (newVal, oldVal) => {
    console.log('watch', newVal, oldVal)
  }, {
    deep: true
  })
  const getData = () => {
    if (!userData) {
        mData.value = {
            name: 'lily',
            age: 10
        }
    } else {
        mData.value = userData.value
    }
    
  }

  // 暴露出去
  return {
    mData,
    getData
  }
}

组件代码:

<template>
    <div class="box">
        {{mData.name}}
    </div>
</template>

<script setup>
import { ref} from 'vue'
import mixins from "@/common/mixins/user";
const user = ref({
    name: 'lucy',
    age: 6
})
const { mData } = mixins(user);
console.log(mData)

</script>
<style lang="scss" scoped>
</style>

### Vue3 全局 Mixin 方法使用教程 在 Vue 3 中,虽然官方推荐使用组合式 API 来实现逻辑复用,但仍然支持通过 `globalProperties` 或者传统的 `mixin` 方式来定义全局混入。以下是关于如何在 Vue 3 中定义和使用全局 Mixin 的详细说明。 #### 定义全局 Mixin 要定义一个全局 Mixin,在 Vue 3 中可以通过 `app.config.globalProperties` 或直接使用 `app.mixin()` 方法完成。以下是一个完整的示例: ```javascript // main.js 文件中的配置 import { createApp } from &#39;vue&#39;; import App from &#39;./App.vue&#39;; const app = createApp(App); // 定义一个混入对象 const globalMixin = { data() { return { globalMessage: &#39;这是一个来自全局 Mixin 的消息&#39;, }; }, created() { console.log(&#39;全局 Mixin 的生命周期钩子被触发&#39;); }, methods: { sayHelloFromGlobalMixin() { console.log(&#39;你好,这是来自全局 Mixin方法!&#39;); }, }, }; // 注册全局 Mixin app.mixin(globalMixin); // 挂载应用 app.mount(&#39;#app&#39;); ``` 上述代码展示了如何在一个 Vue 应用程序中注册一个全局 Mixin[^1]。此 Mixin 提供了一个数据属性 (`globalMessage`)、一个生命周期钩子 (`created`) 和一个方法 (`sayHelloFromGlobalMixin`)。 #### 在组件中使用全局 Mixin 一旦全局 Mixin 被注册成功,它会自动注入到所有的 Vue 组件实例中。这意味着任何组件都可以访问由这个 Mixin 所提供的功能而无需显式的引入或声明。例如: ```html <template> <div id="example"> {{ globalMessage }} <button @click="sayHelloFromGlobalMixin">点击我</button> </div> </template> <script> export default { name: "ExampleComponent", }; </script> ``` 在这个例子中,我们并没有手动导入或者混合任何东西;然而,“globalMessage” 数据项以及 “sayHelloFromGlobalMixin方法都可用因为它们已经被添加到了每一个组件实例上作为全局 Mixin的一部分[^2]。 需要注意的是,由于全局 Mixin 影响范围广泛,可能会带来不可预见的行为特别是当项目规模增大时。因此建议仅限于特定场景下才考虑采用这种方式,并且最好封装成插件形式以便管理维护[^3]。 另外值得注意的一点是在 Vue 3 版本里尽管依旧保留了对于 Mixins 的支持,但是为了鼓励更好的实践模式即促进代码模块化与清晰度提升,官方更加推崇利用 Composition API 进行跨组件间共享状态及行为逻辑的操作[^4]。 ### 注意事项 - **影响范围**: 全局 Mixin 对所有组件生效,包括第三方库中的组件。 - **冲突风险**: 如果多个 Mixin 同名,则后者覆盖前者的数据/方法等。 - **替代方案**: 推荐优先尝试使用 Composition API 替代传统 Mixin 实现复杂业务需求下的代码复用问题解决办法。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值