import { Component, OnInit, AfterViewInit, OnDestroy, OnChanges, SimpleChanges, Input, ViewChild, ElementRef } from '@angular/core'; import * as echarts from 'echarts'; @Component({ selector: 'app-chart-component', standalone: true, templateUrl: './chart-component.component.html', styleUrls: ['./chart-component.component.css'] }) export class ChartComponentComponent implements OnInit, OnDestroy, OnChanges { @ViewChild('chart', { static: true }) chartContainer!: ElementRef; private chartInstance: echarts.ECharts | null = null; // 接收外部传入的配置项(例如:柱状图、折线图等配置) @Input() options: echarts.EChartsOption = {}; /** 默认样式 */ defaultTooltipOptions = { tooltip: { trigger: 'item', borderColor: '#00eff8', backgroundColor: '#12192C', padding: [6, 14, 6, 14], textStyle: { fontSize: 14, color: '#74FAFB', }, position: 'top', axisPointer: { type: 'shadow' } }, series: [ { type: 'gauge', startAngle: 180, endAngle: 0, center: ['50%', '75%'], radius: '90%', min: 0, max: 1, splitNumber: 8, axisLine: { lineStyle: { width: 6, color: [ [0.25, '#74FAFB'], [0.5, '#74FAFB'], [0.75, '#74FAFB'], [1, '#74FAFB'] ] } }, pointer: { icon: 'path://M12.8,0.7l12,40.1H0.7L12.8,0.7z', length: '12%', width: 20, offsetCenter: [0, '-60%'], itemStyle: { color: 'auto' } }, axisTick: { length: 12, lineStyle: { color: 'auto', width: 2 } }, splitLine: { length: 20, lineStyle: { color: 'auto', width: 5 } }, axisLabel: { color: '#464646', fontSize: 20, distance: -60, rotate: 'tangential', formatter: function (value: any) { if (value === 0.875) { return ''; } else if (value === 0.625) { return ''; } else if (value === 0.375) { return ''; } else if (value === 0.125) { return ''; } return ''; } }, title: { offsetCenter: [0, '-10%'], fontSize: 20 }, tooltip: { trigger: 'item', borderColor: '#00eff8', backgroundColor: '#12192C', padding: [6, 14, 6, 14], textStyle: { fontSize: 14, color: '#74FAFB', }, position: 'top', axisPointer: { type: 'shadow' } }, detail: { fontSize: 30, offsetCenter: [0, '-5%'], valueAnimation: true, formatter: function (value: any) { return Math.round(value * 100) + ''; }, color: 'inherit' }, } ] }; constructor() { } ngOnInit(): void { console.log('ChartComponentComponent ngOnInit'); this.initEcharts(); } ngOnChanges(changes: SimpleChanges): void { if (changes['options'] && !changes['options'].isFirstChange()) { console.log('ChartComponentComponent ngOnChanges'); this.updateChartOptions(); } } ngOnDestroy(): void { if (this.chartInstance) { console.log('ChartComponentComponent ngOnInit'); this.chartInstance.dispose(); } } initEcharts(): void { const chartDom = this.chartContainer.nativeElement; this.chartInstance = echarts.init(chartDom, 'dark'); // 设置默认的tooltip配置,如果外部传入了tooltip则会覆盖这里的设置 // 合并默认和外部传入的配置项 const mergedOptions = { ...this.defaultTooltipOptions, ...this.options }; this.chartInstance.setOption(mergedOptions); } updateChartOptions(): void { if (this.chartInstance) { this.chartInstance.setOption(this.options); } } }