Chart.vue 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. <script lang="ts" setup>
  2. defineExpose({loadChart, carousel})
  3. import * as echarts from "echarts";
  4. import {waterQualitys} from "@/utils/unit.js";
  5. import {nextTick, onMounted, onUnmounted, ref} from "vue";
  6. const chartRef = ref(null)
  7. let chart = null
  8. let timer = undefined
  9. async function loadChart(option) {
  10. if (!chart) {
  11. await nextTick(); // 确保DOM已经渲染完成
  12. chart = echarts.init(chartRef.value);
  13. }
  14. chart.setOption(option, true);
  15. setTimeout(() => chart.resize(), 1000)
  16. }
  17. function reloadChart() {
  18. const checkAndResize = () => {
  19. if (chart) {
  20. chart.resize();
  21. } else {
  22. setTimeout(checkAndResize, 1000);
  23. }
  24. };
  25. checkAndResize();
  26. }
  27. /* 轮播 */
  28. function carousel(timeout = 5000, yAxisChange = false) {
  29. const checkAndCarousel = () => {
  30. if (chart) {
  31. // 获取legend的data
  32. const legendData = chart.getOption().legend[0].data
  33. // 首次总是从0开始的
  34. let i = 0
  35. // 开始轮播
  36. timer = setInterval(() => {
  37. // 激活
  38. chart.dispatchAction({
  39. type: 'legendToggleSelect',
  40. name: legendData[++i % legendData.length]
  41. })
  42. }, 10000)
  43. if (yAxisChange) {
  44. chart.on('legendselectchanged', function (params) {
  45. let selected = undefined;
  46. for (let key in params.selected) {
  47. if (params.selected[key] === true) {
  48. selected = key;
  49. break
  50. }
  51. }
  52. let field = waterQualitys.find(i => i.label === selected)
  53. if (field) {
  54. chart.setOption({yAxis: {name: field.unit,}});
  55. }
  56. });
  57. }
  58. } else {
  59. setTimeout(checkAndCarousel, 1000);
  60. }
  61. }
  62. checkAndCarousel();
  63. }
  64. onMounted(() => chartRef.value?.addEventListener("resize", reloadChart))
  65. onUnmounted(() => {
  66. if (timer) {
  67. clearInterval(timer)
  68. timer = null
  69. }
  70. chartRef.value?.removeEventListener("resize", reloadChart)
  71. if (chart && chart.dispose) {
  72. chart.dispose();
  73. }
  74. })
  75. </script>
  76. <template>
  77. <div ref="chartRef" class="chart-wrapper"></div>
  78. </template>
  79. <style lang="scss" scoped>
  80. .chart-wrapper {
  81. width: 100%;
  82. height: 100%;
  83. }
  84. </style>