PieChart1.vue 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. <!-- 饼图 -->
  2. <template>
  3. <el-card>
  4. <div :id="id" :class="className" :style="{ height, width }"></div>
  5. </el-card>
  6. </template>
  7. <script setup lang="ts">
  8. import * as echarts from "echarts";
  9. import { defineProps, ref } from "vue";
  10. const props = defineProps({
  11. id: {
  12. type: String,
  13. default: "pieChart",
  14. },
  15. className: {
  16. type: String,
  17. default: "",
  18. },
  19. width: {
  20. type: String,
  21. default: "200px",
  22. required: true,
  23. },
  24. height: {
  25. type: String,
  26. default: "200px",
  27. required: true,
  28. },
  29. list: {
  30. type: Array,
  31. default: [],
  32. required: true,
  33. },
  34. });
  35. const options = {
  36. title: {
  37. text: "订单准时完成率",
  38. x: "center",
  39. textStyle: {
  40. color: "#fff",
  41. },
  42. },
  43. tooltip: {
  44. trigger: "item",
  45. formatter: "{b} : {c} ({d}%)",
  46. },
  47. legend: {
  48. orient: "vertical",
  49. x: "left",
  50. data: ["直接访问", "邮件营销", "联盟广告", "视频广告", "搜索引擎"],
  51. },
  52. calculable: true,
  53. series: [
  54. {
  55. name: "访问来源",
  56. type: "pie",
  57. radius: "75%",
  58. center: ["50%", "50%"],
  59. data: [
  60. { name: "直接访问", value: 70 },
  61. { value: 30, name: "邮件营销" },
  62. ],
  63. },
  64. ],
  65. };
  66. const chart = ref<any>("");
  67. watch?.(
  68. () => props.list,
  69. (newVal) => {
  70. options.series[0].data = props.list;
  71. options.legend.data = [];
  72. props.list.forEach((item) => {
  73. options.legend.data.push(item.name);
  74. });
  75. handle();
  76. }
  77. );
  78. const handle = () => {
  79. chart.value = markRaw(
  80. echarts.init(document.getElementById(props.id) as HTMLDivElement)
  81. );
  82. chart.value.setOption(options);
  83. window.addEventListener("resize", () => {
  84. chart.value.resize();
  85. });
  86. };
  87. onMounted(() => {
  88. handle();
  89. });
  90. onActivated(() => {
  91. if (chart.value) {
  92. chart.value.resize();
  93. }
  94. });
  95. </script>