echarts二次封装

目录结构

在这里插入图片描述

基础echarts代码(BaseCharts.vue)

<template>
  <div :class="className" :style="{ height: chartData.height, width: chartData.width }" />
</template>

<script>
import echarts from 'echarts';
import 'echarts/theme/macarons';
import resize from './mixins/resize';

export default {
  name: 'BaseChart',
  props: {
    className: {
      type: String,
      default: 'chart',
    },
    chartData: {
      type: Object,
      required: true,
      default: () => ({}),
    },
  },
  mixins: [resize],
  data() {
    return {
      chart: null,
    };
  },
  watch: {
    chartData: {
      deep: true,
      handler() {
        this.initChart();
      },
    },
  },
  mounted() {
    this.initChart();
    this.$nextTick(() => {
      this.initChart();
    });
  },
  beforeDestroy() {
    if (!this.chart) {
      return;
    }
    this.chart.dispose();
    this.chart = null;
  },
  methods: {
    initChart() {
      this.chart = echarts.init(this.$el, 'macarons');
      this.setOptions(this.chartData);
    },
    setOptions({ series, grid, yAxis, xAxis, legend, tooltip, radar } = {}) {
      this.chart.setOption({
        tooltip,
        grid,
        xAxis,
        yAxis,
        series,
        legend,
        radar,
      });
    },
  },
};
</script>

mixins文件代码

import _ from 'lodash';

export default {
  data() {
    return {
      $_sidebarElm: null,
      $_resizeHandler: null,
    };
  },
  mounted() {
    this.initListener();
  },
  activated() {
    if (!this.$_resizeHandler) {
      // avoid duplication init
      this.initListener();
    }

    // when keep-alive chart activated, auto resize
    this.resize();
  },
  beforeDestroy() {
    this.destroyListener();
  },
  deactivated() {
    this.destroyListener();
  },
  methods: {
    // use $_ for mixins properties
    // https://vuejs.org/v2/style-guide/index.html#Private-property-names-essential
    $_sidebarResizeHandler(e) {
      if (e.propertyName === 'width') {
        this.$_resizeHandler();
      }
    },
    initListener() {
      this.$_resizeHandler = _.debounce(() => {
        this.resize();
      }, 100);
      window.addEventListener('resize', this.$_resizeHandler);

      this.$_sidebarElm = document.getElementsByClassName('sidebar-container')[0];
      this.$_sidebarElm &&
        this.$_sidebarElm.addEventListener('transitionend', this.$_sidebarResizeHandler);
    },
    destroyListener() {
      window.removeEventListener('resize', this.$_resizeHandler);
      this.$_resizeHandler = null;

      this.$_sidebarElm &&
        this.$_sidebarElm.removeEventListener('transitionend', this.$_sidebarResizeHandler);
    },
    resize() {
      const { chart } = this;
      chart && chart.resize();
    },
  },
};

页面使用封装的 echarts

页面中引用:chartThreeData 为封装后传入的数据
在这里插入图片描述

this.chartThreeData = {
        width: '100%',
        height: 'calc(100% - 50px)',
        textStyle,
        grid: {
          top: '22%',
          left: '15%',
          right: '10px',
          bottom: '18%',
        },
        xAxis: {
          type: 'category',
          axisLabel: {
            color: '#ffffff',
            fontSize,
            fontFamily,
          },
          data: yearList,
        },
        yAxis: {
          splitNumber: 3,
          boundaryGap: [0, '10%'],
          type: 'value',
          ...nameInfo,
          name: '单位(次)',
          splitLine: {
            show: false,
          },
          axisLabel: {
            color: '#ffffff',
            fontSize,
            fontFamily,
          },
        },
        series: [
          {
            name: '数据专线业务数',
            type: 'line',
            data: specialLine,
            itemStyle: {
              color: '#8c3633',
            },
          },
        ],
        tooltip: {
          show: true,
          trigger: 'axis',
          padding: 15,
          textStyle,
          formatter: renderTooltip,
        },
      };
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值