echarts封装组件(动态数据)

2020-12-25  本文已影响0人  为光pig

封装echarts饼图组件(其他同理),动态更新数据

方法1

父组件

<templete>
 <div>
     <div>
         <span :style="{display:'inline-block',textIndent: '2em'}">简介...</span>
     </div>
     <Piechart
         @propData="propData"
         :id="pieData.id"
         :echartStyle="pieData.s"
         :titleText="pieData.title.text"
         :colorful="pieData.b"
         :opinion="pieData.c"
         :seriesName="pieData.d"
         :opinionData="pieData.e"
     />
 </div>
</templete>

import Piechart from '@comp/chart/pieChart'  // 引用子组件

子组件

<template>
  <div :id="id" :style="echartStyle"></div>
</template>

<script>
import Echarts from 'echarts'

export default {
  props: { // 接收父组件的传值
    echartStyle: { // 样式
      type: Object,
      default() {
        return {}
      }
    },
    id: {
      type: String,
      default: 'echarts_id'
    },
    titleText: { // 标题文本
      type: String,
      default: '默认标题'
    },
    opinion: { // 扇形区域名称
      type: Array,
      default() {
        return []
      }
    },
    colorful: { // 颜色
      type: Array,
      default() {
        return []
      }
    },
    seriesName: { // 提示框标题
      type: String,
      default: ''
    },
    opinionData: { // 扇形区域数据
      type: Array,
      default() {
        return []
      }
    }
  },
  watch: {  // 监听父组件传过来的数据,动态更新
    opinionData: {
      handler(newVal, oldVal) {
        if (this.charts) {
          newVal ? this.setOption(newVal) : this.setOption(oldVal);
        }
      },
      deep: true,
      immediate: true,
    }
  },
  data() {
    return {
      charts: null,
    }
  },
  mounted() {
    this.drawPie(this.id);
  },
  beforeDestroy() {
    this.charts.dispose();  // 销毁实例
    this.charts = null;
  },
  methods: {
    
    drawPie(id) { // 绘制饼状图
      this.charts = Echarts.init(document.getElementById(id));
      this.setOption(this.opinionData);

      // setTimeout(() => {
      //   let xxx = this.charts.getDataURL({
      //     pixelRatio: 2,
      //     backgroundColor: '#fff'
      //   });
      //   this.$emit('propData', xxx);  // 回调,导出图
      // },2000)
    },
    setOption(option) {
      this.charts.setOption({
        title: {
          text: this.titleText, // 标题文本
          left: 'left'
        },
        tooltip: {
          trigger: 'item',
          formatter: (d) => {
            let list = `<div style="text-align:left;font-size:12px">
              数量: <span style="font-size:16px;font-weight:bolder;">${d.data.top}</span></div>
            <div style="text-align:left;font-size:12px">
              占比: <span style="font-size:16px;font-weight:bolder;">${d.data.proportion}</span></div>`
            return list
          }
        },
        legend: {
          orient: 'vertical',
          right: 'right',
          bottom: 20,
          data: this.opinion // 扇形区域名称
        },
        series: [
          {
            name: this.seriesName, // 提示框标题
            type: 'pie',
            radius: '65%',
            center: ['50%', '50%'],
            selectedMode: 'single',
            data: this.opinionData, // 扇形区域数据
            itemStyle: {
              emphasis: {
                shadowBlur: 10,
                shadowOffsetX: 0,
                shadowColor: 'rgba(0, 0, 0, 0.5)'
              },
            }
          }
        ],
        color: this.colorful, //自定义的颜色
      })
    }
  }
}
</script>

效果图

方法2

父组件

html部分

<wk-Line id="barGroup" :data="numList"  v-if="numList.datano1.length > 0"/>
                    <!-- 无数据 -->
<no-data v-else table/> 

js部分

numList:{//人数分布图表数据
                color:['#c0504e'],
                name:[],
                datano1:[],
                datano2:[],
                legend:['', '']
            },
// 人数分布图表数据处理
                    let numData = [],name = []
                    res.data.buyFailureList.map(item =>{
                        numData.push(item.num)
                    })
                    res.data.buyFailureList.map(item =>{
                        name.push(item.name)
                    })
                    // 更新数组里面的数据
                    this.$set(this.numList,'datano1',numData)
                    this.$set(this.numList,'name',name)

字组件

<template>
    <!-- 柱状图 - 堆叠 -->
    <div class="bar-box" :id="id" :style="styleCpt" style="width:100%;height:20rem;">
    </div>
</template>
<script>
    export default {
        props:['id','styleCpt','data'],
        watch:{
            data:{
                handler(){
                    this.$nextTick(()=>{
                        this.initHandler(this.data);
                    }) 
                },
                immediate:true,
                deep:true
            }
        },
        methods:{
            initHandler(data){
                console.log(data)
                debugger
                let myCharts = this.$echarts.init(document.getElementById(this.id)), chartOption = {};
                //为了清空上一次echarts残留的数据 setOption的值为true
                myCharts.clear(); 
                chartOption = {
                    color:data.color,
                    tooltip: {
                        trigger: 'axis',
                        axisPointer: {            // 坐标轴指示器,坐标轴触发有效
                            type: 'shadow'        // 默认为直线,可选为:'line' | 'shadow'
                        }
                    },
                    legend: {
                        data: data.legend, 
                        bottom: 10,
                    },
                    grid: {
                        left: '%',
                        right: '2%',
                        top: '3%',
                        bottom: data.color.length>1? '20%' : '5%',
                        containLabel: true
                    },
                    xAxis: {
                        type: 'category',
                        boundaryGap: false,
                        data: data.name
                    },
                    yAxis: {
                        type: 'value'
                    },
                    series: [
                        {
                            name: data.legend[0],
                            type: 'line',
                            stack: '总量',
                            data: data.datano1
                        },
                        {
                            name: data.legend[1],
                            type: 'line',
                            stack: '总量',
                            data: data.datano2
                        },

                    ]
                };
                myCharts.setOption(chartOption,true);
                //监听屏幕大小的改变来改变走势图的大小
                window.addEventListener("resize",function (){
                    myCharts.resize();
                })
                let timer = setTimeout(()=>{
                    myCharts.resize();
                    clearTimeout(timer);
                    timer = null;
                }, 500)
            }
        }
    }
</script>
上一篇下一篇

猜你喜欢

热点阅读