echart二次封装组件

VUE2

<template>
  <div :id="id" class="echart"></div>
</template>
<script>
import * as echarts from 'echarts';
export default {
  props: {
    id: {
      type: String,
      default: () => {
        return 'mychart';
      }
    },
    options: {
      type: Object
    }
  },
  data() {
    return {
      myChart: null,
    };
  },
 
  mounted() {
    const el = document.querySelector(`#${this.id}`);
    if (el) {
      this.myChart = echarts.init(el);
      if (this.options) {
        const opt = JSON.parse(JSON.stringify(this.options));
        this.myChart.setOption(opt);
      }
      setTimeout(() => {
        this.resizeChart();
      }, 0);
      
      window.addEventListener('resize', this.resizeChart);
    }
  },
  destroyed() {
    window.removeEventListener('resize', this.resizeChart);
  },

  methods: {
    resizeChart() {
      this.myChart.resize();
    },
    changeOptions() {
      const opt = JSON.parse(JSON.stringify(this.options));
      this.myChart.setOption(opt);
    }
  },
  watch: {
    options: {
      handler() {
        this.changeOptions();
      },
      deep: true
    }
  }
};
</script>
<style lang="scss" scoped>
.echart {
  width: 100%;
  height: 100%;
}
</style>

用法

          <SkChart id="stockCharts" :options="stockOpt" class="chart" />
          //id旨在唯一化图表 可在一个页面通过不同id去区分不同图表 options就是echarts配置项

VUE3

<template>
  <div :id="id" class="echart"></div>
</template>
<script lang="ts">
import { defineComponent, onMounted, onUnmounted, PropType, toRaw, watch } from 'vue';
import * as echarts from 'echarts';
import { EChartsType } from 'echarts';

export default defineComponent({
  props: {
    id: {
      type: String as PropType<string>,
      default: () => {
        return 'mychart';
      },
      requierd: true,
    },
    options: {
      type: Object as PropType<any>,
    },
  },
  setup(props, ctx) {
    
    let myChart: EChartsType | null = null;
    //   监听设置项数据改变
    // 页面布局变化
    const resizeChart = () => {
      myChart?.resize();
    };
    // 图表数据改变
    const changeOptions = () => {
      let opt = toRaw(props.options) as any;
      myChart?.setOption(opt);
      if (props.isImage) {
        setTimeout(() => {
          ctx.emit('getImg', getImageData());
        }, 0);
      }
    };
    watch(
      () => props.options,
      () => {
        changeOptions();
      },
      {
        deep: true,
        immediate: true,
      }
    );

    onMounted(() => {
      let el: HTMLElement | null = document.querySelector(`#${props.id}`);
      if (el) {
        myChart = echarts.init(el);
        if (props.options) {
          let opt = toRaw(props.options) as any;
          myChart.setOption(opt);
        }
        setTimeout(() => {
          resizeChart();
        }, 0);
        window.addEventListener('resize', resizeChart);
      }
    });
    onUnmounted(() => {
      window.removeEventListener('resize', resizeChart);
    });

    return { myChart};
  },
});
</script>
<style lang="scss" scoped>
.echart {
  width: 100%;
  height: 100%;
}
</style>

用法

    <SkChart id="invoiceTrendChart" :options="lineOption" class="chart"></SkChart>

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值