vue+echarts实现饼图组件(实现左右联动并且数据量大时可滚动)

pieChart.vue(直接cv即可)

javascript 复制代码
<template>
  <div class="rBox1">
    <div id="rBox1"></div>
  </div>
</template>

<script>
export default {
  name: "pieChart",
  dicts: [],
  props: {
    subtext: {
      type: String,
      default: "",
    },
    chartData: {
      type: Array,
      default: () => [
        // {
        //   value: 1,
        //   legendName: "类型1",
        //   name: "类型1  335 件/10.5%",
        //   itemStyle: { color: "#8d7fec" },
        // },
      ],
    },
  },
  computed: {
    sum() {
      return this.chartData.reduce((total, item) => {
        return total + item.value;
      }, 0);
    },
  },
  components: {},
  watch: {
    chartData() {
      this.initMyEChart();
    },
  },
  data() {
    return {
      myChart: "",
      option: {},
    };
  },
  methods: {
    initMyEChart() {
      this.option = {
        title: [
          {
            text: this.sum,
            subtext: this.subtext,
            textStyle: {
              fontSize: 30,
              color: "black",
            },
            subtextStyle: {
              fontSize: 14,
              color: "#333",
            },
            textAlign: "center",
            x: "29%",
            y: "37%",
          },
        ],
        tooltip: {
          trigger: "item",
          formatter: function (parms) {
            var str =
              parms.marker +
              "" +
              parms.data.legendName +
              "</br>" +
              "数量:" +
              parms.data.value +
              "</br>" +
              "占比:" +
              parms.percent +
              "%";
            return str;
          },
        },
        legend: {
          type: "scroll",
          orient: "vertical",
          left: "64%",
          align: "left",
          top: "middle",
          textStyle: {
            color: "#8C8C8C",
            fontSize: 12,
          },
          height: 140,
          itemWidth: 10,
          itemHeight: 10,
          itemGap: 10,
        },
        series: [
          {
            name: "类型占比",
            type: "pie",
            center: ["30%", "50%"],
            radius: ["60%", "80%"],
            clockwise: false,
            avoidLabelOverlap: false,
            label: {
              normal: {
                show: true,
                position: "outter",
                formatter: function (parms) {
                  return parms.data.legendName;
                },
              },
            },
            labelLine: {
              normal: {
                length: 5,
                length2: 3,
                smooth: true,
              },
            },
            data: this.chartData,
          },
        ],
      };
      this.myChart = this.$echarts.init(document.getElementById("rBox1"));
      this.myChart.setOption(this.option);

      window.addEventListener("resize", () => {
        this.myChart.resize();
      });
    },
  },
  created() {},
  mounted() {},
  beforeDestroy() {
    this.myChart.clear();
  },
};
</script>

<style lang="scss" scoped>
.rBox1 {
  width: 100%;
  height: 100%;

  #rBox1 {
    width: 100%;
    height: 100%;
  }
}
</style>

使用

javascript 复制代码
    <div class="leftComp-box-content">
        <pieChart ref="pieChart" :chartData="pieData" subtext="事件总量"/>
      </div>
import pieChart from "@/views/pieChart.vue";

  components: {pieChart},
  data() {
    return {
      pieData: [],
    };
  },


    getBox2Data() {
      const data = [
        {
          "name": "拥堵事件",
          "count": 12,
        },
        {
          "name": "道路事件",
          "count": 56,
        },
        {
          "name": "超速事件",
          "count": 105,
        },
        {
          "name": "交通事故",
          "count": 71,
        },
        {
          "name": "气象",
          "count": 10,
        },
        {
          "name": "道路施工",
          "count": 45,
        },
        {
          "name": "道路维护",
          "count": 23,
        },
        {
          "name": "道路瞎写",
          "count": 51,
        },
        {
          "name": "道路维修",
          "count": 30,
        }
      ]
      const sum = data.reduce((total, item) => {
        return total + item.count;
      }, 0);
      this.pieData = data.map((i) => {
        return {
          value: i.count,
          legendName: i.name,
          name: `${i.name}   ${i.count}   件/${((i.count / sum) * 100).toFixed(2)}%`,
        };
      });
    },


 mounted() {
    this.initLeftCompData();
  },




  .leftComp-box-content {
width: 100px;
height: 100px;
      }
相关推荐
赖龙13 小时前
pnpm vs npm
前端·npm·node.js
To_OC13 小时前
LC 239 滑动窗口最大值:从暴力超时到单调队列一遍过
javascript·算法·leetcode
学如逆水,不进则退14 小时前
在线免费音频剪辑:NBTools 可视化波形裁剪 MP3/WAV,本地处理免上传
前端·音视频
Mh14 小时前
虚拟滚动真的比普通滚动性能更好吗?
前端·javascript·性能优化
pe7er14 小时前
React + Ant Design 中的 IME (输入法合成)安全输入组件
前端
Super 含15 小时前
Android 启动优化(二):TTID、TTFD 与 Macrobenchmark 启动性能测量
前端
Python私教15 小时前
别急着加 llms.txt:企业官网面向 AI 搜索的工程清单
前端·人工智能·seo
东方小月15 小时前
从零开发一个 Coding Agent(十三):实现安全的 read 文件读取工具
前端·人工智能·全栈
东方小月15 小时前
从零开发一个 Coding Agent(十二):实现版本化 JSONL 与真实 CLI 入口
前端·设计模式·前端框架
Smile_ping16 小时前
ECharts 图例文本对齐,告别长短不一!
echarts·legend·图例文本对齐