讨论vue中混入mixin的应用

 更新时间:2021年05月11日 14:52:47   作者:sugar_coffee  
这篇文章主要介绍了vue中混入mixin的理解和应用,对vue感兴趣的同学,可以参考下

混入 (mixin) 提供了一种非常灵活的方式,来分发 Vue 组件中的可复用功能。一个混入对象可以包含任意组件选项。当组件使用混入对象时,所有混入对象的选项将被“混合”进入该组件本身的选项。

即 mixin 在引入组件之后,会将组件内部的内容如data、method等属性与父组件相应内容进行合并。相当于在引入后,父组件的各种属性方法都被扩充了。

比如在两个不同的组件的组件中调用sayHi方法,需要重复定义,倘若方法比较复杂,代码将更加冗余,但使用mixins 就相对比较简单了。

首先在 mixin.js 文件中定义一个混入对象:

let mixin = {
  data () {
    return {
      userName: 'mixin'
    }
  },
  created () {
    this.sayHello()
  },
  methods: {
    sayHello () {
      console.log(`${this.userName}, welcome`)
    }
  }
}

export default mixin

然后定义两个组件,分别在组件中引入:

<script>
    import mixin from '../mixin'

    export default {
      mixins: [mixin]
    }
</script>

则两个组件的打印结果都为:

如果在两个组件 data 中定义了各自的 userName,则打印结果会引用各自组件中的 userName

如果在两个组件的 methods 中重复定义了相同的方法,则 mixin 中的方法会被覆盖

给其中一个组件定义自己的 userName 和 sayHi 方法:

<script>
    import mixin from '../mixin'

    export default {
      mixins: [mixin],
      data() {
        return {
          userName: 'BComponent'
        }
      },
      created () {
          this.sayHello()
      },
      methods: {
        sayHello () {
          console.log(`Hi, ${this.userName}`)
        }
      }
    }
</script>

则打印结果:

这有点像注册了一个 vue 公共方法,可以在多个组件中使用。还有一点类似于在原型对象中注册方法,并且可以定义相同函数名的方法进行覆盖。

混入也可以进行全局注册,但一般情况下不会全局使用,因为会污染 vue 实例。

我一般在项目中会这样用,比如在多个组件中有用到通用选择器,选项是:是,否,可以使用 mixin 来添加一个统一的字典项过滤器,来实现选项的回显。

1. 首先创建一个 Dictionary.js 文件,用于保存字典项对应的含义,并将其暴露出去:

export const COMMON_SELECT = [
    { code: 0, label: '是'},
    { code: 1, label: '否'}
];

注:此处创建的 Dictionary.js 文件,也可以在页面渲染的时候拿来循环选项,具体代码如下:

import { COMMON_SELECT } from '../constants/Dictionary.js'

export default {
    data() {
        return {
            comSelectOptions: COMMON_SELECT
        }
    }
}

<select v-mode="selStatus">
    <el-option v-for="item in comSelectOptions" :key="item.code" :label="item.label" :value="item.code"></el-option>
</select>

2.然后再创建一个 filter.js 文件,保存自定义的过滤函数:

import { COMMON_SELECT } from '../constants/Dictionary.js'

export default {
  filters: {
    comSelectFilter: (value) => {
      const target = COMMON_SELECT.filter(item => {
        return item.code === value
      })
      return target.length ? target[0].label : value
    }
  }
}

3.最后在 main.js 中一次性引入 filter 方法:

import filter from './mixin/filter'
Vue.mixin(filter)

欧了,这样我们就可以在任一组件中随意使用了

<template>
    <div>
        ....
        {{ status | comSelectFilter }}
        ....
    </div>  
</template>

以上就是讨论vue中混入mixin的应用的详细内容,更多关于vue中混入mixin的应用的资料请关注脚本之家其它相关文章!

相关文章

  • nodejs读取并去重excel文件

    nodejs读取并去重excel文件

    给大家带来一篇关于用nodejs实现excel文件的读取并去重的功能,有兴趣的朋友参考学习下。
    2018-04-04
  • axios实现文件上传并获取进度

    axios实现文件上传并获取进度

    这篇文章主要为大家详细介绍了axios实现文件上传并获取进度,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-09-09
  • vue.js国际化 vue-i18n插件的使用详解

    vue.js国际化 vue-i18n插件的使用详解

    本篇文章主要介绍了vue.js国际化 vue-i18n插件的使用详解,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • 详解vue中使用protobuf踩坑记

    详解vue中使用protobuf踩坑记

    这篇文章主要介绍了vue中使用protobuf踩坑记,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • elementui导出数据为xlsx、excel表格

    elementui导出数据为xlsx、excel表格

    本文主要介绍了elementui导出数据为xlsx、excel表格,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • vue3 中使用 reactive 的问题小结

    vue3 中使用 reactive 的问题小结

    在 Vue 3 中,如果你使用 reactive 来定义一个响应式对象,那么这个对象的属性是不能被重新赋值的,因为 reactive 会将对象的属性转换为 getter/setter,这样 Vue 才能追踪到属性的变化,这篇文章主要介绍了vue3 中使用 reactive 的问题,需要的朋友可以参考下
    2024-03-03
  • vue深拷贝的三种实现方式示例详解

    vue深拷贝的三种实现方式示例详解

    vue深拷贝的三种实现方式:1、通过递归方式实现深拷贝;2、JSON.parse(JSON.stringify(obj));3、jQuery的extend方法实现深拷贝,本文通过实例代码给大家介绍的非常详细,需要的朋友参考下吧
    2023-11-11
  • 使用Vue绑定class和style样式的几种写法总结

    使用Vue绑定class和style样式的几种写法总结

    这篇文章主要介绍了使用Vue绑定class和style样式的几种写法,文章通过代码示例介绍的非常详细,具有一定的参考价值,需要的朋友可以参考下
    2023-07-07
  • vue 导航守卫和axios拦截器有哪些区别

    vue 导航守卫和axios拦截器有哪些区别

    这篇文章主要介绍了vue 导航守卫和axios拦截器有哪些区别,帮助大家更好的理解和使用vue,感兴趣的朋友可以了解下
    2020-12-12
  • vue3+vite实现在线预览pdf功能

    vue3+vite实现在线预览pdf功能

    这篇文章主要为大家详细介绍了如何通过vue3和vite实现在线预览pdf功能,文中的示例代码简洁易懂,具有一定的借鉴价值,感兴趣的小伙伴可以学习一下
    2023-10-10

最新评论