|  | @@ -0,0 +1,125 @@
 | 
	
		
			
				|  |  | +<template>
 | 
	
		
			
				|  |  | +  <div ref="chartRef" style="width: 100%; height: 400px;"></div>
 | 
	
		
			
				|  |  | +</template>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +<script>
 | 
	
		
			
				|  |  | +import * as echarts from "echarts";
 | 
	
		
			
				|  |  | +import { markRaw } from "vue";
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +export default {
 | 
	
		
			
				|  |  | +  name: "LineChart",
 | 
	
		
			
				|  |  | +  props: {
 | 
	
		
			
				|  |  | +    chartData: {
 | 
	
		
			
				|  |  | +      type: Object,
 | 
	
		
			
				|  |  | +      required: true,
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +  },
 | 
	
		
			
				|  |  | +  data() {
 | 
	
		
			
				|  |  | +    return {
 | 
	
		
			
				|  |  | +      myChart: null,
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +  },
 | 
	
		
			
				|  |  | +  watch: {
 | 
	
		
			
				|  |  | +    // 监听 chartData 的变化,动态更新图表
 | 
	
		
			
				|  |  | +    chartData: {
 | 
	
		
			
				|  |  | +      deep: true,
 | 
	
		
			
				|  |  | +      handler() {
 | 
	
		
			
				|  |  | +        this.initChart();
 | 
	
		
			
				|  |  | +      },
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +  },
 | 
	
		
			
				|  |  | +  mounted() {
 | 
	
		
			
				|  |  | +    this.$nextTick(() => {
 | 
	
		
			
				|  |  | +      this.initChart();
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  | +  },
 | 
	
		
			
				|  |  | +  methods: {
 | 
	
		
			
				|  |  | +    initChart() {
 | 
	
		
			
				|  |  | +      const showtip = this.chartData.showTooltip;
 | 
	
		
			
				|  |  | +      console.log("showtip:", showtip)
 | 
	
		
			
				|  |  | +      if (this.myChart) {
 | 
	
		
			
				|  |  | +        this.myChart.dispose();
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      this.myChart = markRaw(echarts.init(this.$refs.chartRef));
 | 
	
		
			
				|  |  | +      // 复制一份 series 数据,避免修改原始数据
 | 
	
		
			
				|  |  | +      const newSeries = this.chartData.series.map(seriesItem => ({
 | 
	
		
			
				|  |  | +        ...seriesItem,
 | 
	
		
			
				|  |  | +        // 设置数据点的大小
 | 
	
		
			
				|  |  | +        symbolSize: 10 ,
 | 
	
		
			
				|  |  | +        emphasis: {
 | 
	
		
			
				|  |  | +           symbolSize: 30,
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +      }));
 | 
	
		
			
				|  |  | +      
 | 
	
		
			
				|  |  | +      const option = {
 | 
	
		
			
				|  |  | +        // 根据 showTooltip 变量的值来设置 tooltip,并且配置显示数值
 | 
	
		
			
				|  |  | +        // tooltip: {
 | 
	
		
			
				|  |  | +        //     trigger: 'axis' // 触发类型为坐标轴触发,当鼠标在坐标轴区域移动时显示提示框
 | 
	
		
			
				|  |  | +        //   },
 | 
	
		
			
				|  |  | +        tooltip: showtip ? {
 | 
	
		
			
				|  |  | +            trigger: 'axis', // 触发类型为坐标轴触发,当鼠标在坐标轴区域移动时显示提示框
 | 
	
		
			
				|  |  | +            show: true,
 | 
	
		
			
				|  |  | +          } : {
 | 
	
		
			
				|  |  | +            show: true,
 | 
	
		
			
				|  |  | +            trigger: 'axis',
 | 
	
		
			
				|  |  | +          }, 
 | 
	
		
			
				|  |  | +        // tooltip: {
 | 
	
		
			
				|  |  | +        //   trigger: "axis",
 | 
	
		
			
				|  |  | +        //   formatter: (params) => {},
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        title: {
 | 
	
		
			
				|  |  | +          //text: this.chartData.title || "简单折线图",
 | 
	
		
			
				|  |  | +          text: this.chartData.title + "简单折线图",
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        legend: {
 | 
	
		
			
				|  |  | +          data: this.chartData.series.map((s) => s.name),
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        grid: {
 | 
	
		
			
				|  |  | +          left: "3%",
 | 
	
		
			
				|  |  | +          right: "4%",
 | 
	
		
			
				|  |  | +          bottom: "3%",
 | 
	
		
			
				|  |  | +          containLabel: true,
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        toolbox: {
 | 
	
		
			
				|  |  | +          feature: {
 | 
	
		
			
				|  |  | +            saveAsImage: {},
 | 
	
		
			
				|  |  | +          },
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        xAxis: {
 | 
	
		
			
				|  |  | +          type: "category",
 | 
	
		
			
				|  |  | +          boundaryGap: false,
 | 
	
		
			
				|  |  | +          data: this.chartData.categories,
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        yAxis: {
 | 
	
		
			
				|  |  | +          type: "value",
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        series: newSeries //this.chartData.series,
 | 
	
		
			
				|  |  | +      };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      this.myChart.setOption(option, true);
 | 
	
		
			
				|  |  | +      this.myChart.resize();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      // 监听点击事件
 | 
	
		
			
				|  |  | +      //this.myChart.on('click', 'series', (params) => {
 | 
	
		
			
				|  |  | +      this.myChart.on('click', (params) => {
 | 
	
		
			
				|  |  | +        if (params.componentType === 'series') {
 | 
	
		
			
				|  |  | +          // 点击的是数据系列
 | 
	
		
			
				|  |  | +          alert(`点击了 ${params.seriesName} 在 ${this.chartData.categories[params.dataIndex]} 的值为 ${params.data}`);
 | 
	
		
			
				|  |  | +        } else if (params.componentType === 'xAxis' || params.componentType === 'yAxis') {
 | 
	
		
			
				|  |  | +          // 点击的是坐标轴
 | 
	
		
			
				|  |  | +          alert(`点击了 ${params.componentType === 'xAxis' ? 'X 轴' : 'Y 轴'}`);
 | 
	
		
			
				|  |  | +        } else {
 | 
	
		
			
				|  |  | +          // 点击了其他区域
 | 
	
		
			
				|  |  | +          alert('点击了图表其他区域');
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      });
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +  },
 | 
	
		
			
				|  |  | +  beforeUnmount() {
 | 
	
		
			
				|  |  | +    if (this.myChart) {
 | 
	
		
			
				|  |  | +      this.myChart.dispose();
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  },
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +</script>
 |