vue3+ts 之echarts 仪表盘 gauge 的使用 之 让图表动起来的使用以及踩坑记录

vue3+ts 之echarts的使用 之 让图表动起来 --- 仪表盘


前言

项目中需要展示一个仪表盘,仪表盘的数据来源是动态获取的,根据获取到的数据变化,仪表盘动态展示当前的数据
在之前的一篇文章中介绍了如何在 vue3 + ts 的环境中使用 echarts 的图表,图表类型是基础的仪表盘 — gauge
这是相关的文章 vue3+ts 之echarts的使用 以及 echarts 图表初始不渲染,代码改变之后才渲染


一、实现效果

当传给图表组件的数据发生变化,图表组件自行渲染展示动画
在这里插入图片描述

二、使用步骤

1.实现思路

在一开始使用的时候展示的是一个固定数据的仪表盘渲染,但是需要让它根据实时数据动起来
起初的想法是 echarts 作为这么完善的一个图表组件库,肯定是有这方面的功能的,所以就去官网开始找相关的 API

在官方找到了关于 数据动态更新 的部分
在这里插入图片描述
在这里插入图片描述
这里表示可以通过 setOption 来传入新的数据, echarts 拿到数据后会和之前的数据做对比,找到当中的差异并自己通过合适的动画来渲染展示
所以 echarts 来动态展示数据,只需要再获取到新的数据之后再次 setOption 就可以了

2.上代码 ! ~

代码如下:以下是封装的图表子组件 RemainGauge.vue 的代码

<!--这里是关于满仓率的图表-->
<template>
  <div ref="chartRef" :style="{ width, height }"></div>
</template>
<script lang="ts" setup>
  import {
    
     Ref, ref, watch } from 'vue';
  import {
    
     useECharts } from '/@/hooks/web/useECharts';

  const props = defineProps({
    
    
    loading: Boolean,
    width: {
    
    
      type: String as PropType<string>,
      default: '100%',
    },
    height: {
    
    
      type: String as PropType<string>,
      default: '300px',
    },
    ratio: Number,
  });

  const chartRef = ref<HTMLDivElement | null>(null);
  const {
    
     setOptions } = useECharts(chartRef as Ref<HTMLDivElement>);


  watch(
    () => props.loading,
    () => {
    
    
      if (props.loading) {
    
    
        return;
      }
      setOptions({
    
    
        tooltip: {
    
    
          formatter: '{a}<br/>{b} : {c}',
        },

        series: [
          {
    
    
            name: '满仓率',
            type: 'gauge',
            progress: {
    
    
              show: true,

              itemStyle: {
    
    
                color: '#165DFF',
              },
            },
            pointer: {
    
    
              width: 5,
              itemStyle: {
    
    
                color: '#165DFF',
              },
            },
            detail: {
    
    
              valueAnimation: true,
              formatter: function (value) {
    
    
                if (isNaN(value)) {
    
    
                  return '加载中';
                } else{
    
    
                  return value + '%';
                }
              },
              fontSize: 20,
            },
            data: [
              {
    
    
                value: props.ratio,
              },
            ],
          },
        ],
      });
    },
    {
    
     immediate: true },
  );

  watch(
    () => props.ratio,
    () => {
    
    
      setOptions(
        {
    
    
          series: {
    
    
            data: [
              {
    
    
                value: props.ratio,
              },
            ],
          },
        },
        false,
      );
    },
  );
</script>

父组件引用子组件位置的代码

  <RemainGuage :ratio="panelObj.fullPercent"  />

3.代码分析

在以上子组件代码中通过 watch 来监听传过来的数据 ratio 是否有变化,如果有变化就执行 setOption

setOptions(
        {
    
    
          series: {
    
    
            data: [
              {
    
    
                value: props.ratio, 
              },
            ],
          },
        },
        false,
      );

因为仪表盘中需要改变的数据仅仅只有一个,那就是 series.data.value 所以再次 setOption 的时候只需要将这一个数据传过去就好了
其中 setOption 的参数官网是如下图介绍的
在这里插入图片描述
大多数场景下使用 setOption 都是只用了第一个参数
而让 echart 动起来的关键在于再次执行 setOption 的时候的第二个参数 – notMerge (这是我自己在本次使用踩坑过程中的理解,如果有误,欢迎大家指正 ~ )
在这里插入图片描述
根据官网描述 , notMerge 为 false 会和之前的组件进行差异对比,ECharts找到两组数据之间的差异然后通过合适的动画去表现数据的变化。这也就是我所期望的
如果为 true 会将之前的组件删除,重新根据新的 option 创建新的组件
当时这里我遇到一个问题 : 官方描述 notMerge 不设置的时候默认为 false ,我所需要的也正是 notMerge = false 但是我实际使用过程中,不对 notMerge 进行设置的时候却报错了
在这里插入图片描述在这里插入图片描述
在设置为 false 之后,就一切正常了,在这小小的踩了个坑 TAT 特此记录下


总结

以上就是我自己在使用 echarts 的 仪表盘 gauge 图表动态展示数据的相关分析,如有不准确之处,欢迎各位指正吖 ~

猜你喜欢

转载自blog.csdn.net/YZRHANYU/article/details/129640881