混入 (mixin) 提供了一种很是灵活的方式,来分发 Vue 组件中的可复用功能。一个混入对象能够 包含任意组件选项。当组件使用混入对象时,全部混入对象的选项将被 “混合”进入该组件自己的选项。
戳 我 查 看 官 方 文 档
即 mixin 在引入组件以后,是将组件内部的内容如data、method等属性与父组件相应内容进行合并。至关于在引入后,父组件的各类属性方法都被扩充了。html
好比在两个不一样的组件的组件中调用sayHi方法,须要重复定义,假若方法比较复杂,代码将更加冗余。若借助mixins,则变得十分简单:vue
首先在 mixin.js 文件中定义一个混入对象:ide
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>
则两个组件的打印结果都为:ui
若是在两个组件 data 中定义了本身的 userName,则打印结果会引用各自组件中的 userNamethis
若是在两个组件methods 中重复定义了相同的方法,则 mixin 中的方法会被覆盖spa
给其中一个组件定义本身的 userName 和 sayHi 方法::code
<script\> import mixin from '../mixin' export default { mixins: \[mixin\], data() { return { userName: 'BComponent' } }, created () { this.sayHello() }, methods: { sayHello () { console.log(\`Hi, ${this.userName}\`) } } } </script>
则打印结果为:htm
这有点像注册了一个 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>
这个相似于过滤,你们也能够 点此查看过滤器的使用方法