quanyawei
2023-09-27 ea9f9a9f6dc6dc88f3916d1d25a0cb3be436d1ba
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
<template>
  <div :class="className" :style="{ height: height, width: width }" />
</template>
 
<script>
// import echarts from 'echarts'
import * as echarts from 'echarts'
require('echarts/theme/macarons') // echarts theme
// import resize from '@/components/Echarts/mixins/resize'
export default {
  // mixins: [resize],
  props: {
    className: {
      type: String,
      default: 'chart'
    },
    width: {
      type: String,
      default: '100%'
    },
    height: {
      type: String,
      default: '290px'
    },
    chartData: {
      type: Array,
      required: false,
      default: () => []
    }
  },
  data() {
    return {
      chart: null,
      seriesData: []
    }
  },
  watch: {
    'chartData': {
      handler(newVal) {
        console.log('newVal', newVal)
        this.seriesData = []
        this.seriesData = newVal
        this.$nextTick(() => {
          this.initChart()
        })
      },
      deep: true,
      immediate: true
    }
  },
  mounted() {
    this.$nextTick(() => {
      this.initChart()
    })
  },
  beforeDestroy() {
    if (!this.chart) {
      return
    }
    this.chart.dispose()
    this.chart = null
  },
  methods: {
    initChart() {
      this.chart = echarts.init(this.$el, 'macarons')
      this.setOptions()
    },
    setOptions() {
      // function fontSize(res) {
      //     let clientWidth =
      //         window.innerWidth ||
      //         document.documentElement.clientWidth ||
      //         document.body.clientWidth
      //     if (!clientWidth) return
      //     let fontSize = 100 * (clientWidth / 1920)
      //     return res * fontSize
      // }
 
      this.chart.setOption(
        {
          color: ['#F56463', '#00C6FF', '#F09615', '#0079E6', '#a814ff', '#03b915'],
          legend: {
            itemHeight: 14,
            itemWidth: 14,
            icon: 'rect',
            orient: 'vertical',
            top: 'center',
            right: '5%',
            textStyle: {
              align: 'left',
              color: '#',
              verticalAlign: 'middle',
              rich: {
                name: {
                  width: 80,
                  fontSize: 16
                },
                value: {
                  width: 20,
                  align: 'right',
                  fontFamily: 'Medium',
                  fontSize: 16
                },
                rate: {
                  width: 10,
                  align: 'right',
                  fontSize: 16
                }
              }
            },
            data: this.seriesData,
            formatter: (name) => {
              if (this.seriesData.length) {
                const item = this.seriesData.filter((item) => item.name === name)[0]
                return `{name|${name}}{value| ${item.value}}`
              }
            }
          },
          tooltip: {
            trigger: 'item',
            backgroundColor: 'rgba(255,255,255,.8)', // 通过设置rgba调节背景颜色与透明度
            color: 'gray'
          },
          series: [
            {
              name: '',
              type: 'pie',
              radius: ['30%', '80%'],
              center: ['35%', '50%'],
              roseType: 'radius',
              label: {
                formatter: '{d}%'
              },
              labelLine: {
                length: 1,
                length2: 20
              },
              data: this.seriesData
            }
          ]
        },
        true
      )
      this.chart.resize()
      window.onresize = this.chart.resize
    }
  }
}
</script>