<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"; 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, }, }, data() { return { chart: null, config: { xAxis: [ { data: [], boundaryGap: false, axisTick: { show: false, }, }, ], grid: { left: 60, right: 60, bottom: 20, top: 30, containLabel: true, }, tooltip: { trigger: "axis", axisPointer: { type: "cross", }, padding: [5, 10], }, yAxis: [ { boundaryGap: false, axisTick: { show: false, }, }, ], legend: { data: [], }, series: [ { // smooth: true, type: "line", data: [], animationDuration: 2800, animationEasing: "cubicInOut", }, ], }, }; }, 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 = {}; option = this.config; const series = chartData.data.map((v) => { return { name: v.name, value: Number(v.value), }; }); option.xAxis[0].data = series.map((_) => _.name); option.series[0].data = series.map((_) => _.value); this.chart.setOption(option); }, }, }; </script>