Newer
Older
urbanLifeline_YanAn / src / views / oneMap / smartTunnel / components / twoLine.vue
@zhangqy zhangqy on 13 Nov 4 KB 性能优化
<template>
  <div class="chartBox" :id="id"></div>
</template>
<script setup name="twoLine">
import { guid } from "@/utils/ruoyi";

const { proxy } = getCurrentInstance();
const props = defineProps({
  //刷新标志
  refresh: {
    type: [String, Number],
    default: 1,
  },
  //数据
  echartData: {
    type: Object,
    default: {
      series: [],
    },
  },
  title: {
    type: String,
    default: "",
  },
});
// console.log('-------------------', props.title);

const id = guid();
const myChart = shallowRef("");

watch(
  () => props.refresh,
  (value) => {
    //先销毁实例
    myChart.value && myChart.value.dispose();
    intChart();
  }
);
//自适应
function resizeTheChart() {
  if (myChart.value) {
    myChart.value.resize();
  }
}
//初始化
function intChart() {
  myChart.value = proxy.echarts.init(document.getElementById(id));
  myChart.value.clear();
  // 绘制图表
  if (!props.echartData.series.length) return;
  let seriesOption = [];
  let colorOption = [
    ["rgba(49, 119, 255, 1)", "rgba(49, 119, 255, 0.1)"],
    ["rgba(19,229,154, 1)", "rgba(19,229,154, 0.1)"],
  ];
  props.echartData.series.forEach((item, index) => {
    let obj = {};
    obj.name = item.name;
    obj.type = "line";
    obj.data = item.tabY;
    obj.showAllSymbol = true; //显示所有图形。
    // obj.smooth = true;
    obj.smooth = false;
    obj.symbol = "circle"; //标记的图形为实心圆
    obj.symbolSize = 6; //标记的大小
    obj.lineStyle = {
      color: colorOption[index][0],
    };
    obj.tooltip = {
      valueFormatter: function (value) {
        return value + (props.echartData.unit || "");
      },
    };
    obj.areaStyle = {
      color: new proxy.echarts.graphic.LinearGradient(0, 0, 0, 1, [
        {
          offset: 0,
          color: colorOption[index][0],
        },
        {
          offset: 1,
          color: colorOption[index][1],
        },
      ]),
    };
    obj.itemStyle = {
      //折线拐点标志的样式
      color: colorOption[index][0],
    };

    seriesOption.push(obj);
  });

  myChart.value.setOption({
    tooltip: {
      trigger: "axis",
      axisPointer: {
        type: "shadow",
        label: {
          show: true,
        },
      },
    },
    grid: {
      top: "22%",
      bottom: "15%", //也可设置left和right设置距离来控制图表的大小
      left: "10%",
      right: "5%",
    },
    legend: {
      show: true,
      // itemWidth: 20,
      // itemHeight: 8,
      itemGap: 30,
      top: 6,
      icon: "rect", // 设置图例图标为矩形
      itemWidth: 10, // 图例图标宽度
      itemHeight: 10, // 图例图标高度
      selectedMode: false,
      data: ["南向北", "北向南"],
      textStyle: {
        color: "#ebfeff",
        fontSize: 16,
      },
    },
    xAxis: {
      data: props.echartData.tabX,
      // data: ["9/1", "9/2","9/3", "9/4","9/5","9/6","9/7"],
      axisLine: {
        show: true, //隐藏X轴轴线
        lineStyle: {
          color: "#357da7",
        },
      },
      axisTick: {
        show: false, //隐藏X轴刻度
        lineStyle: {
          // color: 'rgba(171, 171, 171, 1)',
        },
      },
      axisLabel: {
        show: true,
        color: "#ebfeff",
        // interval: 0,
        fontSize: 16,
        // formatter: function (value) {
        //   // return value.split(' ').join('\n');
        //   return value.slice(5);
        // },
      },
      // splitLine: {    //网格线
      //   lineStyle: {
      //     type: 'dashed'    //设置网格线类型 dotted:虚线   solid:实线
      //   },
      //   show: true //隐藏或显示
      // },
    },
    yAxis: {
      type: "value",
      name: props.echartData.unit || "",
      nameLocation: "end", // 将名称靠顶部
      // nameRotate: 0, // 名称水平显示
      nameTextStyle: {
        color: "#ebfeff",
        fontSize: 16,
        padding: [0, 20, -2, 0],
      },
      axisLine: {
        show: false,
      },
      axisLabel: {
        show: true,
        color: "#ebfeff",
        fontSize: 16,
      },
      splitLine: {
        //网格线
        lineStyle: {
          type: "solid",
          color: "#357da7", //设置网格线类型 dotted:虚线   solid:实线
        },
        show: true, //隐藏或显示
      },
    },
    series: seriesOption,
  });
}
onMounted(() => {
  intChart();
  window.addEventListener("resize", resizeTheChart);
});
onBeforeUnmount(() => {
  myChart.value && myChart.value.dispose();
});
</script>

<style lang="scss" scoped>
.chartBox {
  width: 100%;
  height: 100%;
}
</style>