<template> <div :class="className" :style="{ height: height, width: width }" /> </template> <script> import * as echarts from "echarts" // require("echarts/theme/macarons"); // echarts theme import resize from "./mixins/resize" const animationDuration = 2600 export default { mixins: [resize], props: { className: { type: String, default: "chart", }, width: { type: String, default: "100%", }, height: { type: String, default: "350px", }, autoResize: { type: Boolean, default: true, }, chartData: { type: Object, required: true, }, chartConfig: { type: Object, default: () => { return {} }, }, }, data() { return { chart: null, pieConfig: { title: { text: "", left: "center", }, tooltip: { trigger: "item", formatter: "{b} : {c} ({d}%)", }, legend: { top: "bottom", }, series: [ { type: "pie", radius: ["40%", "70%"], itemStyle: { borderRadius: 10, borderColor: "#fff", borderWidth: 2, }, label: { show: true, formatter: "{b} : {c} ({d}%)", }, emphasis: { label: { show: true, fontSize: "16", fontWeight: "bold", }, }, data: [], animationDuration, }, ], }, } }, watch: { chartData: { deep: true, handler(val) { this.setOptions(val) }, }, }, mounted() { this.$nextTick(() => { this.initChart() }) }, beforeDestroy() { if (!this.chart) { return } this.chart.dispose() this.chart = null }, methods: { initChart() { this.chart = echarts.init(this.$el) this.setOptions(this.chartData) }, setOptions(chartData) { if (!chartData.data) return let option = JSON.parse( JSON.stringify(Object.assign(this.pieConfig, this.chartConfig)) ) const series = chartData.data.map((v) => { return { name: v.name, value: Number(v.value), } }) option.series[0].data = series this.chart.setOption(option) }, }, } </script>