PieChart1.vue 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  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. },
  40. tooltip : {
  41. trigger: 'item',
  42. formatter: "{b} : {c} ({d}%)"
  43. },
  44. legend: {
  45. orient : 'vertical',
  46. x : 'left',
  47. data:['直接访问','邮件营销','联盟广告','视频广告','搜索引擎']
  48. },
  49. calculable : true,
  50. series : [
  51. {
  52. name:'访问来源',
  53. type:'pie',
  54. radius : '75%',
  55. center: ['50%', '50%'],
  56. data:[
  57. { name:'直接访问',value:70},
  58. {value:30, name:'邮件营销'},
  59. ]
  60. }
  61. ]
  62. };
  63. const chart = ref<any>("");
  64. watch?.(
  65. () => props.list,
  66. (newVal) => {
  67. options.series[0].data = props.list
  68. options.legend.data = []
  69. props.list.forEach(item=>{
  70. options.legend.data.push(item.name)
  71. })
  72. handle()
  73. }
  74. );
  75. const handle=()=>{
  76. chart.value = markRaw(
  77. echarts.init(document.getElementById(props.id) as HTMLDivElement)
  78. );
  79. chart.value.setOption(options);
  80. window.addEventListener("resize", () => {
  81. chart.value.resize();
  82. });
  83. }
  84. onMounted(() => {
  85. handle();
  86. });
  87. onActivated(() => {
  88. if (chart.value) {
  89. chart.value.resize();
  90. }
  91. });
  92. </script>