ECharts之PieChart的封装使用


对应PieChart的参考地址

在这里插入图片描述

一、示例代码

1.1 引入echarts
// 在主文件中引入
import Echart from 'echarts';
Vue.prototype.$echarts = Echart;
1.2 组件
// PieChart.vue
<template>
  <div :id="name"
       style="height: 200px;width:500px">
  </div>
</template>

<style lang='less' scoped>
</style>

<script lang='ts'>
import { Component, Vue, Prop } from 'vue-property-decorator';

@Component
export default class PieChart extends Vue {
// 获取渲染data
  @Prop({
    type: Array,
    default: () => [],
  })
  checkData!: any[];

//获取动态id名
  @Prop({
    type: String,
  })
  name!: string;

  $echarts: any;

//初始化表格数据
  intCharts() {
    const chart: any = this.$echarts.init(document.getElementById(this.name));
    const options = {
      tooltip: {
        trigger: 'item',
        // 图例展示的格式
        formatter: '{b}: {c} ({d}%)',
      },
      legend: {
        orient: 'vertical',
        left: 'left',
        top: '10%',
        // 自定义格式化函数
        formatter(name: any) {
          const data = options.series[0].data;
          let total = 0;
          for (let i = 0; i < data.length; i++) {
            total += data[i].value;
          }
          const val = data.filter((item) => {
            return item.name === name;
          });
          const v = val[0].value;
          const p = Math.round((v / total) * 100);
          return `${name}  ${v}人(${p}%)`;
        },
      },
      series: [
        {
          name: '访问来源',
          type: 'pie',
          radius: '50%',
          data: this.checkData,
          center: ['60%', '50%'],
          emphasis: {
            itemStyle: {
              shadowBlur: 10,
              shadowOffsetX: 0,
              shadowColor: 'rgba(0, 0, 0, 0.5)',
            },
          },
        },
      ],
    };
    chart.setOption(options);
  }

  mounted() {
    this.intCharts();
  }
}
</script>
1.3 组件使用
<template>
	<div class="mt-30"
         v-for="(item,index) in checkData"
         :key="item.id">
         <!--这里的key一定要为唯一标识项-->
      <div><span style="color:red">*</span>{{index+1}}、统计数据</div>
      <PieChart :checkData="item"
                :name="'item'+index" />
    </div>
</template>

<script lang='ts'>
	import {  Vue } from 'vue-property-decorator';
	import PieChart from '../components/PieChart.vue';
	export default class StatisticsAnalyze extends Vue {
		checkData = [
		    [
		      { value: 50, name: '搜索引擎',id:'36723471' },
		      { value: 5, name: '直接访问' ,id:'36723472'},
		      { value: 5, name: '邮件营销' ,id:'36723473'},
		      { value: 10, name: '联盟广告' ,id:'36723474'},
		      { value: 30, name: '视频广告' ,id:'36723475'},
		    ],
		    [
		      { value: 50, name: '很好' ,id:'36723476'},
		      { value: 5, name: '好' ,id:'36723477'},
		      { value: 5, name: '一般',id:'36723478' },
		      { value: 10, name: '差' ,id:'36723479'},
		      { value: 30, name: '非常差',id:'36723480' },
		    ],
	  ];
	  
	}
</script>

二、 遇到的问题及解决

2.1 渲染多个图表

要保证dom的id值不同,我这里是通过传递name来解决的

2.2 当打开不同问卷展示相同位置的图表时发现是上次的

这个真的坑到我了,原因最后发现是我v-for循环时,key值用index导致的,以前不以为然的东西,真的很重要。所有key一定要唯一标识项,不然不更新。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值