Vue中的mixin混入用法小结

309 阅读3分钟

mixin有什么用?

简而言之,就是可以把vue中的data、method、mounted(生命周期)、filter、watch、props这些option api都一口气导入。在项目过程中,我们有时候会写一些方法,这些方法会执行一系列相同的操作。这个时候,如果通过Mixin混入,则可以有效减少重复的代码。

怎么用Mixin?

talking is cheap, show me you code!直接上代码:

//mixin.js
export const logInfo = {
  methods: {
    showInfo() {
      console.log('来自mixin的消息')
    },
  }, 
  mounted (){
    console.log('大家好,我是mixin.js')  //console.log('大家好,我是mixin.js')  
  }
}
//component.vue
<template>
  <div id="myChart" />
</template>

<script>
import { logInfo } from './mixin.js';
export default {
  name: 'Mixin',
  mixins: [ logInfo ],
  mounted (){
    this.showInfo()  //console.log('来自mixin的消息')  
  }
  
}
</script>

这就是mixin最简单的用法,通过mixin这个api,我们实现了在组件中调用或者执行外部导入的方法。mixin的最大特点就是,不仅能混合数据和方法,还能混合生命周期,filter过滤器,computed计算属性等option api。值得注意的是,当mixin中的methods和组件中的methods相同时,mixin中的方法会被覆盖更新。而mounted等生命周期中的方法都会执行,而mixin中的生命周期会先执行,而组件中的生命周期后执行。

用Mixin实现echarts图标自动生成。

echarts是开发中经常使用的数据可视化库,用它可以生成许多可视化效果很好的图表。echarts组件的图表生成、销毁以及动态变化大小这些功能的代码都是重复的,将其写进mixin中,可以有效减少重复代码,如下:

// echartsMixin.js
// 生成能够自适应并自动轮播tips的echarts图表
import echarts from 'echarts'
export const echartsMixin = {
  data() {
    return {
      myChart: null,
      option: {},
    }
  },
  mounted() {
    this.myChart = echarts.init(document.getElementById(this.id))
    this.myChart.setOption(this.option)
    window.addEventListener('resize', () => {
      this.myChart.resize()
    })
    this.autoTips()
  },
  methods:{
    autoTips() {
      console.log(1111111111111);
      // 动态显示tootip
      let faultByHourIndex = 0 // 播放所在下标
      // eslint-disable-next-line
      let faultByHourTime = setInterval(() => { // 使得tootip每隔三秒自动显示
        this.myChart._api.dispatchAction({
          type: 'showTip', // 根据 tooltip 的配置项显示提示框。
          seriesIndex: 0,
          dataIndex: faultByHourIndex
        })
        faultByHourIndex++
        if (faultByHourIndex > this.option.series[0].data.length) {
          faultByHourIndex = 0
        }
      }, 3000)
      this.$once('hook:beforeDestroy', () => {
        clearInterval(faultByHourTime)
      })
    }
  }
}
//component.vue
<template>
  <div id="myChart" />
</template>

<script>
import { echartsMixin } from './echartsMixin.js';
export default {
  name: 'Mixin',
  mixins: [echartsMixin],
  data() {
    return {
      option: {
        color: ['#30E57D', '#F26443', '#8A979D'],
        title: {
          text: '各区域设备运行情况分析',
          textStyle: {
            color: '#ffffff',
            fontSize: 14
          },
          left: '2%'
        },
        tooltip: {
          trigger: 'axis',
          axisPointer: {
            type: 'shadow'
          }
        },
        legend: {
          data: ['在线', '离线'],
          textStyle: {
            color: '#ffffff',
            fontSize: 12
          },
          right: '3%'
        },
        grid: {
          left: '3%',
          right: '3%',
          bottom: '0%',
          height: '80%',
          containLabel: true
        },
        xAxis: {
          axisLabel: {
            color: '#ffffff'
          },
          type: 'category',
          data: ['C区域', 'D区域', 'E区域', 'F区域', 'G区域', 'H区域']
        },
        yAxis: {
          splitLine: {
            lineStyle: {
              color: '#7d7d7e'
            }
          },
          axisLabel: {
            color: '#ffffff'
          },
          type: 'value',
          boundaryGap: [0, 0.01]
        },
        series: [
          {
            name: '在线',
            type: 'bar',
            data: [10, 6, 8, 9, 12, 7]
          },
          {
            name: '离线',
            type: 'bar',
            data: [1, 2, 1, 2, 1, 1]
          }
        ]
      },
      id: "myChart"
    }
  }
  
}
</script>

<style lang="scss" scoped>
#myChart {
  height: 500px;
  background-color: black;
}
</style>

结果如图:

以上,我们就实现了一个自动生成echarts的混入,每次要生成图表的时候,只要在新组件中的data中注册option和id就可以了。