讨论vue中混入mixin的应用

混入 (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的应用的资料请关注我们其它相关文章!

(0)

相关推荐

  • 深入了解Vue.js 混入(mixins)

    混入 (mixins)定义了一部分可复用的方法或者计算属性.混入对象可以包含任意组件选项.当组件使用混入对象时,所有混入对象的选项将被混入该组件本身的选项. 来看一个简单的实例: var vm = new Vue({ el: '#databinding', data: { }, methods : { }, }); // 定义一个混入对象 var myMixin = { created: function () { this.startmixin() }, methods: { startmix

  • 详解Vue的mixin策略

    我之前一直以为mixin的合并是以组件内的优先,即mixin的内容如果和组件内有冲突的,以组件内为准,确实存在这种情况,但是vue指定的策略更详细,下面分别记录各种情况对应的合并策略 基本 当一个组件使用mixin的时候,所有mixin的选项会被混入到组件自己的选项中, 这部分没什么好说的,直接看代码 // define a mixin object const myMixin = { created() { this.hello() }, methods: { hello() { consol

  • vue使用mixins优化组件

    vue 提供了 mixins 这个 API,可以让我们将组件中的可复用功能抽取出来,放入 mixin 中,然后在组件中引入 mixin,可以让组件显得不再臃肿,提高了代码的可复用性. 如何理解 mixins 呢 ?我们可以将 mixins 理解成一个数组,数组中有单或多个 mixin,mixin 的本质就是一个 JS 对象,它可以有 data.created.methods 等等 vue 实例中拥有的所有属性,甚至可以在 mixins 中再次嵌套 mixins,It's amazing ! 举个

  • Vue用mixin合并重复代码的实现

    在我们做项目的时候,往往有很多代码逻辑是通用的,比如说,业务逻辑类型的判断,时间戳的转换,url中字符串的截取等等,这些函数如果在每个需要的页面中都加入的话,不仅加重了当前页面的逻辑复杂程度,还会占用大量原本可以省略的内存.因此,将这些代码整理出来统一管理是很有必要的,在vue项目中,我们都知道模块化和组件化,但vue的框架中还有一个很好用的知识点,就是mixin. mixin不仅可以存放data.watch.methods.computed等,还可以存放Vue的生命周期,是不是很神奇呢? 通过

  • 深入浅析Vue中mixin和extend的区别和使用场景

    Vue中有两个较为高级的静态方法mixin和extend,接下来我们来讨论下关于他们各自的原理和使用场景. Mixin: 原理: 先来看看官网的介绍: 参数:{Object} mixin 用法: 混入也可以进行全局注册.使用时格外小心!一旦使用全局混入,它将影响每一个之后创建的 Vue 实例.使用恰当时,这可以用来为自定义选项注入处理逻辑. // 为自定义的选项 'myOption' 注入一个处理器. Vue.mixin({ created: function () { var myOption

  • Vue之Mixins(混入)的使用方法

    混入 (mixin) 提供了一种非常灵活的方式,来分发 Vue 组件中的可复用功能.一个混入对象可以包含任意组件选项.当组件使用混入对象时,所有混入对象的选项将被"混合"进入该组件本身的选项. 当组件和混入对象含有同名选项时,这些选项将以恰当的方式进行"合并". 比如,数据对象在内部会进行递归合并,并在发生冲突时以组件数据优先. var Mymixin = { data: function(){ return { message: 'hello', foo: 'ab

  • 使用vue中的混入mixin优化表单验证插件问题

    这段时间开发的时候使用到了这个表单校验插件,用起来比较麻烦就不说了,还有较严重的缺陷.自己最终还是抽空把这个插件进行了一些优化,虽然优化的方式和当初自己定下的方向不怎么相同,但是就使用体验上来说还是提高了很多. 1. 实际开发中遇到的问题 在上面的文章中提及了一些表单插件的问题,主要针对的是插件开发本身存在的问题.下面我总结下使用中存在的问题: 每个使用表单校验的元素都需要添加 v-check 类名,比较麻烦. 必须在提交表单按钮上使用 v-checkSubmit 指令进行表单校验,提交函数必须

  • 记一次Vue.js混入mixin的使用(分权限管理页面)

    需求背景:在一个后台的管理系统中,不同的用户角色对应不同的用户权限.现要求,同一个页面对有操作权限的用户来说是可操作的,对无操作权限的用户来说是只读的,即操作按钮均失效.系统用Vue.js开发. 一.mixin的概念 官方文档这么说:混入是一种分发Vue组件中可服用功能的非常灵活的方式.混入对象可以包含任意组件选项.当组件使用混入对象时,所有混入对象的选项将被混入该组件本身的选项. 我自己的理解:混入对象具有Vue组件可以声明的所有选项,如[components].[computed].[met

  • Vue混入mixins滚动触底的方法

    前言 在app端常常看到类似加载数据的动画,接下来我们来实现滚动触底加载动画提示,以及如何复用这些逻辑. 如何判断滚动触底 来看下几张图: 情况一: 当文档高度还为超过可视区域高度时,不存在滚动,所以也没有滚动触底 情况二: 当文档高度超过可视区域的高度时,还有剩余的文档没有滚动完,也就是说 可视区域高度 + 滚动高度 < 文档高度 ,此时没有达到滚动触底的条件   情况三: 文档高度大于可视区域,并且滚动到文档底部, 也就是说 可视区域高度 + 滚动高度 = 文档高度 判断是否滚动到底 经过上

  • Vue使用mixin分发组件的可复用功能

    vue创建高阶组件的实现不够react优雅,但那是vue和react的设计思想导致的.在react中一切都是函数,而在vue中,组件最终都是函数,但在开发时可以是JSON对象,而且每个vue组件要注意三个点:props.events和slots,就是这三个导致vue创建高阶组件时要传入相应的属性,较react要复杂. vue官方推荐使用mixins来完成高阶组件的功能,如果对vue实现高阶组件有兴趣的话推荐看[vue实现高阶组件][1] 下面是vue官网使用mixins的例子: // 定义一个混

随机推荐