<template> <div :id="id" style="width: 100%; height: 100%"></div> </template> <script> import * as echarts from "echarts"; import { guid } from "@/utils/ruoyi"; import { reactive, toRefs, onMounted, onUnmounted, watch } from "vue"; import bus from "@/bus"; export default { name: "line-chart", props: { data: Object, refresh: Number, ClickData: String, TypeID: String, }, setup(props) { const allData = reactive({ series: [], legend: [], id: guid(), chart: null, timer: null, }); const resizeTheChart = () => { if (allData.chart) { allData.chart.resize(); } }; const init = () => { // let chartDom = echarts.init(document.getElementById(allData.id)); //先获取Dom上的实例 let chartDom = echarts.getInstanceByDom(document.getElementById(allData.id)); //然后判断实例是否存在,如果不存在,就创建新实例 if (chartDom == null) { chartDom = echarts.init(document.getElementById(allData.id)); } var option; option = { tooltip: { trigger: "axis", backgroundColor: "#004284", borderColor: "#0B9BFF", borderRadius: 6, // 设置圆角大小 // 自定义提示框文本样 textStyle: { // 字体颜色 color: "white", // 字体大小 fontSize: 14, }, formatter: (params) => { // console.log(params); var relVal = "" + params[0].name; for (var i = 0, l = params.length; i < l; i++) { if (params[i].seriesName) { let unit = "次"; relVal += "<br/>" + params[i].marker + params[i].seriesName + " " + params[i].value + unit; } } return relVal; }, }, legend: { data: [props.data.yAxis2_line_Name, props.data.yAxis3_line_Name], textStyle: { color: "#FFFFFF", fontSize: 12, }, }, grid: { bottom: "0%", right: "0%", left: "0%", containLabel: true, }, xAxis: { type: "category", boundaryGap: true, data: props.data.xAxis, axisLabel: { color: "rgba(255,255,255,1)", fontSize: 12, fontFamily: "AlibabaPuHuiTi", formatter: function (params) { var str = ""; // 最终拼接成的字符串 var paramsLen = params.length; // 获取每项文字的个数 var len = props.data.xAxis.length > 7 ? 2 : 3; // 每行能显示的字的个数(根据实际情况自己设置) var rowNumber = Math.ceil(paramsLen / len); // 换行的话,需要显示几行,向上取整 if (paramsLen > len) { //大于设定的len就换行,不大于就不变化 for (var i = 0; i < rowNumber; i++) { var temp = ""; // 表示每一次截取的字符串 var start = i * len; // 开始截取的位置 var end = start + len; // 结束截取的位置 if (i == rowNumber - 1) { // 最后一次不换行 temp = params.substring(start, paramsLen); } else { // 每一次拼接字符串并换行 temp = params.substring(start, end) + "\n"; } str += temp; // 最终拼成的字符串 } } else { // 给新的字符串赋值 str = params; } return str; //返回字符串 }, }, }, yAxis: { name: props.data.y1_Unit, type: "value", minInterval: 1, axisLabel: { color: "#AAC1CF", show: true, }, nameTextStyle: { color: "#AAC1CF", }, splitLine: { lineStyle: { type: "dashed", color: "#2161a8", }, }, alignTicks: true, }, series: [ { name: props.data.yAxis2_line_Name, type: "line", data: props.data.yAxis2_line, // 修改折线颜色 lineStyle: { color: "aqua", // 折线颜色 width: 2, // 折线宽度 }, // 修改数据点颜色 itemStyle: { color: "aqua", // 数据点颜色 }, }, { name: props.data.yAxis3_line_Name, type: "line", data: props.data.yAxis3_line, // 修改折线颜色 lineStyle: { color: "yellow", // 折线颜色 width: 2, // 折线宽度 }, // 修改数据点颜色 itemStyle: { color: "yellow", // 数据点颜色 }, }, ], }; option && chartDom.setOption(option, true); allData.chart = chartDom; animateChart(); // 监听点击事件 allData.chart.on("click", function (params) { // params.value 是点击的X轴标签的值 console.log("echarts点击事件", params.value, props.ClickData, props.TypeID); // 在这里可以执行相应的逻辑 bus.emit("openJXFXDialog", { name: params.name, ClickData: props.ClickData, }); }); }; watch( () => props.refresh, () => { console.log(props, "propspropsprops"); if (allData.chartDom) { allData.chartDom.dispose(); allData.chartDom = null; // clearInterval(allData.timer); } allData.chart.off("click"); setTimeout(() => { init(); }, 0); } ); // echarts动画 function animateChart() { let length = props.data.xAxis.length; let i = 0; if (allData.timer) clearInterval(allData.timer); allData.timer = setInterval(() => { allData.chart.dispatchAction({ type: "showTip", seriesIndex: 0, dataIndex: i, }); i++; if (i == length) i = 0; }, 3000); } onMounted(() => { init(); window.addEventListener("resize", resizeTheChart); }); onUnmounted(() => { if (allData.timer) clearInterval(allData.timer); }); return { ...toRefs(allData), resizeTheChart, init, }; }, }; </script>