Vue中mixins混入的介绍和使用详解

 更新时间:2023年08月16日 11:08:02   作者:阿镇吃橙子  
mixins(混入)是一种分发 Vue 组件中可复用功能的非常灵活的方式,这篇文章主要为大家介绍了mixins混入的介绍和使用,需要的可以参考下

当项目越来越大,项目中组件之间可能会存在一些相似的功能,这就导致了在各个组件中需要编写功能相同的代码段,重复地定义这些相同的属性和方法,导致代码地冗余,还不利于后期代码的维护。

一、什么是Mixins

mixins(混入):一种分发 Vue 组件中可复用功能的非常灵活的方式,mixins 是一个 js 对象,它可以包含我们组件script中的任意功能选项,如:data、components、methods、created、computed 等等。我们只要将公用的功能以对象的方式传入 mixins 选项中,当组件使用 mixins 对象,所有 mixins 对象的选项都将被扩展到该组件本身的选项中来,这样就可以提高代码的重用性,并易于后期的代码维护。

二、何时使用Mixins

当存在多个组件中的数据或者功能很相近时,我们就可以利用 mixins 将公共部分提取出来,通过 mixins 封装函数。

三、如何创建Mixins

src 目录下创建一个 mixins 文件夹,在文件夹下新建一个 myMixins.js 文件。因为 mixins 是一个 js 对象,所以应该以对象的形式来定义 myMixins。在对象中可以和 vue 组件一样来定义 data、components、methods、created、computed 等属性,并通过 export 导出该对象。

四、如何使用Mixins

在需要调用的组件中引入 myMixins.js 文件,然后在 export default 中引入需要的对象即可。

五、Mixins的主要特性

1.方法和参数在不同的组件中不共享

当某一个组件调用了 mixins 并将其属性合并到自己组件中,其属性只会被当前这个组件所识别,也就是说其他组件无法从当前组件中获取到 mixins 中的数据和方法,做到了很好的数据隔离效果。如下所示:

// 在 myMixins.js 中定义一个 age 字段和 getAge 方法,用来获取年龄信息
export const myMixins = {
  data() {
    return {
      age: 18,
    }
  },
  mounted() {
    this.getAge()
  },
  methods: {
    getAge() {
      console.log(this.age)
    }
  }
}
// 在第一个组件中引入 mixins,并且对 age 加1 
import { myMixins } from "@/mixins/myMixins.js";
export default {
  mixins: [myMixins],
  data() {
    return {}
  },
  created() {
    this.age++
  },
}
// 发现控制台输出 19,说明当前组件的 age 变化了 
// 在第二个组件中引入 mixins,但是不做任何处理
import { myMixins } from "@/mixins/myMixins.js";
export default {
  mixins: [myMixins],
  data() {
    return {}
  },
}
// 发现控制台输出 18,说明当前组件的 age 无影响

2.Mixins 合并冲突

当 mixins 的值为对象(components、methods 、computed、data),混入到某个组件中时,选项会被合并。当对象名称冲突时优先组件,组件中的值会覆盖混入对象的。

// 混入myMixins.js对象中增加age属性、getAge1方法、getAge2方法
export const myMixins = {
  components:{},
  data() {
    return {
      age: 18,
    }
  },
  methods: {
    getAge1() {
      console.log("age1 from mixins", this.age )
    },
    getAge2() {
      console.log("age2 from mixins", this.age )
    },
  }
}
// 组件中自带age属性、getAge1方法、getAge3方法;同时引入 mixins。
import { myMixins } from "@/mixins/myMixins.js";
export default {
  mixins: [myMixins],
  data() {
    return {
      age: 20,
    }
  },
  mounted() {
    this.getAge1();
    this.getAge2();
    this.getAge3();
  },
  methods: {
    getAge1() {
      console.log('age1 from template', this.age)
    },
    getAge3() {
      console.log('age3 from template', this.age)
    },
  }
}
// 输出控制台发现,组件中的age覆盖了混合对象的age,组件的getAge1方法覆盖了混合对象的getAge1方法
// age1 from template 20
// age2 from mixins 20
// age3 from template 20

当值为函数(created、mounted)的选项,混入到组件中时,选项会被合并调用,混合对象里的钩子函数在组件里的钩子函数之前调用。

// myMixins.js
export const myMixins = {
  components:{},
  data() {
    return {}
  },
  created() {
    console.log('data from mixins')
  }
}
// 组件中引入 mixins
import { myMixins } from "@/mixins/myMixins.js";
export default {
  mixins: [myMixins],
  data() {
    return {}
  },
  created() {
    console.log('data from template')
  }
}
// 先输出混入对象的值,再输入组件的值
// data from mixins
// data from template

六、mixins 中有异步请求的情况

当混入里面包含异步请求函数,而我们又需要在组件中使用异步请求函数的返回值时,我们会取不到此返回值,解决方案是:不要返回结果,而是直接返回异步函数

// myMixins.js 中直接返回异步函数
export const myMixins = {
  components:{},
  data() {
    return {
      num: 1,
    }
  },
  methods: {
   async getDate1() {
      let result = await new Promise((resolve,reject) => {
          let a = 1;
          setTimeout(() => {
            resolve(1)
          },500)
       })
       return result
    },
  }
}
// 组件中获取混入的异步函数,通过then 方法获取函数值。
import { myMixins } from "./myMixins.js";
export default {
  mixins: [myMixins],
  data() {
    return {}
  },
  mounted() {
    this.getDate1().then(res => {
      console.log(res)
    })
  }
}

七、与 vuex 的区别

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

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

八、与公共组件的区别

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

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

到此这篇关于Vue中mixins混入的介绍和使用详解的文章就介绍到这了,更多相关Vue mixins混入内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 简单谈谈Vue 模板各类数据绑定

    简单谈谈Vue 模板各类数据绑定

    Vue.js 的模板是基于 DOM 实现的。这意味着所有的 Vue.js 模板都是可解析的有效的 HTML,且通过一些特殊的特性做了增强。Vue 模板因而从根本上不同于基于字符串的模板,请记住这点。
    2016-09-09
  • vue用h()函数创建Vnodes的实现

    vue用h()函数创建Vnodes的实现

    Vue提供了一个h()函数用于创建vnodes,本文就来介绍一下vue用h()函数创建Vnodes的实现,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • 在 Linux/Unix 中不重启 Vim 而重新加载 .vimrc 文件的流程

    在 Linux/Unix 中不重启 Vim 而重新加载 .vimrc 文件的流程

    这篇文章主要介绍了在 Linux/Unix 中不重启 Vim 而重新加载 .vimrc 文件的流程,需要的朋友可以参考下
    2018-03-03
  • 前端vue项目打包为war包的实现示例

    前端vue项目打包为war包的实现示例

    本文介绍将前端项目打包为war包的步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-11-11
  • Vue项目如何改变屏幕尺寸重新刷新页面-计算页面尺寸

    Vue项目如何改变屏幕尺寸重新刷新页面-计算页面尺寸

    这篇文章主要介绍了Vue项目如何改变屏幕尺寸重新刷新页面-计算页面尺寸,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • 如何在vite里获取env环境变量浅析

    如何在vite里获取env环境变量浅析

    开发中经常会使用环境变量,Vite相比于Webpack也有一定的变化,下面这篇文章主要给大家介绍了关于如何在vite里获取env环境变量的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-10-10
  • 使用VUE实现在table中文字信息超过5个隐藏鼠标移到时弹窗显示全部

    使用VUE实现在table中文字信息超过5个隐藏鼠标移到时弹窗显示全部

    这篇文章主要介绍了使用VUE实现在table中文字信息超过5个隐藏,鼠标移到时弹窗显示全部,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-09-09
  • vue 注释template中组件的属性说明

    vue 注释template中组件的属性说明

    这篇文章主要介绍了vue 注释template中组件的属性说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-04-04
  • Vue3实现文本差异对比器的具体方案

    Vue3实现文本差异对比器的具体方案

    本文将介绍本项目中 文本差异对比器 (Text Diff Checker) 工具的技术实现细节,该工具基于 Vue 3 框架开发,核心对比逻辑采用原生的 JavaScript 实现,通过动态加载的方式与 Vue 组件进行交互,需要的朋友可以参考下
    2026-02-02
  • Vue实例简单方法介绍

    Vue实例简单方法介绍

    这篇文章主要为大家详细介绍了Vue实例的一些简单方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01

最新评论