当前位置: 首页 > article >正文

14. Vue 3 中使用 ECharts 实现仪表盘

引言

仪表盘是一种常见的数据可视化组件,广泛应用于实时数据监控、设备状态显示等场景。在前端开发中,ECharts 是一款强大的图表库,能够轻松地帮助我们实现复杂的图表效果。本文将介绍如何在 Vue 3 项目中,利用 ECharts 来实现一个简单而实用的仪表盘。

项目准备

在开始之前,我们需要确保以下几点:

  • 已安装 Vue 3 项目环境。
  • 已安装 ECharts 库。

如果你还没有安装 ECharts,可以通过 npm 安装:

npm install echarts --save

完整代码

<!--
 * @Author: 彭麒
 * @Date: 2025/1/21
 * @Email: 1062470959@qq.com
 * @Description: 此源码版权归吉檀迦俐所有,可供学习和借鉴或商用。
 -->
<template>
  <div class="w-full justify-start flex h-[180px] items-center pl-10 bg-[#222939]">
    <BackButton @click="goBack"/>
  </div>
  <div class="font-bold text-[24px] bg-[#222939] text-white">在Vue3中使用Echarts实现仪表盘</div>
  <div class="dashboard-container">
    <div ref="chartRef" class="gauges-chart"></div>
  </div>
</template>

<script setup lang="ts">
import { ref, onMounted, onUnmounted } from 'vue'
import * as echarts from 'echarts'
import BackButton from "@/views/components/BackButton.vue";
import router from "@/router";
const goBack = () => {
  setTimeout(() => {
    router.push('/Echarts')
  }, 1000)
}
const chartRef = ref<HTMLElement | null>(null)
let chart: echarts.ECharts | null = null

const highlight = '#03b7c9'

const demoData = [
  { name: '电压', value: 220, unit: 'V', pos: ['16.6%', '25%'], range: [0, 400] },
  { name: '电流', value: 32, unit: 'A', pos: ['49.8%', '25%'], range: [0, 60] },
  { name: '功率因数', value: 0.9, pos: ['83%', '25%'], range: [0.1, 1.0], splitNum: 9 },
  { name: '有功功率', value: 6.34, unit: 'kW', pos: ['16.6%', '75%'], range: [0, 50] },
  { name: '有功电能', value: 6.28, unit: 'kWh', pos: ['49.8%', '75%'], range: [0, 50] },
  { name: '电网频率', value: 50, unit: 'Hz', pos: ['83%', '75%'], range: [0, 100] }
]

const initChart = () => {
  if (!chartRef.value) return

  chart = echarts.init(chartRef.value)

  const option = {
    backgroundColor: '#222939',
    series: demoData.map(item => [
      // 外围刻度
      {
        type: 'gauge',
        center: item.pos,
        radius: '33.33%',
        splitNumber: item.splitNum || 10,
        min: item.range[0],
        max: item.range[1],
        startAngle: 225,
        endAngle: -45,
        axisLine: {
          show: true,
          lineStyle: {
            width: 2,
            shadowBlur: 0,
            color: [[1, highlight]]
          }
        },
        axisTick: {
          show: true,
          lineStyle: {
            color: highlight,
            width: 1
          },
          length: -5,
          splitNumber: 10
        },
        splitLine: {
          show: true,
          length: -14,
          lineStyle: {
            color: highlight
          }
        },
        axisLabel: {
          distance: -20,
          textStyle: {
            color: highlight,
            fontSize: '14',
            fontWeight: 'bold'
          }
        },
        pointer: {
          show: 0
        },
        detail: {
          show: 0
        }
      },
      // 内侧指针、数值显示
      {
        name: item.name,
        type: 'gauge',
        center: item.pos,
        radius: '30.33%',
        startAngle: 225,
        endAngle: -45,
        min: item.range[0],
        max: item.range[1],
        axisLine: {
          show: true,
          lineStyle: {
            width: 16,
            color: [[1, 'rgba(255,255,255,.1)']]
          }
        },
        axisTick: {
          show: 0
        },
        splitLine: {
          show: 0
        },
        axisLabel: {
          show: 0
        },
        pointer: {
          show: true,
          length: '105%'
        },
        detail: {
          show: true,
          offsetCenter: [0, '100%'],
          textStyle: {
            fontSize: 20,
            color: '#fff'
          },
          formatter: [
            '{value} ' + (item.unit || ''),
            '{name|' + item.name + '}'
          ].join('\n'),
          rich: {
            name: {
              fontSize: 14,
              lineHeight: 30,
              color: '#ddd'
            }
          }
        },
        itemStyle: {
          normal: {
            color: highlight
          }
        },
        data: [{
          value: item.value
        }]
      }
    ]).flat()
  }

  chart.setOption(option)
}

const handleResize = () => {
  chart?.resize()
}

onMounted(() => {
  initChart()
  window.addEventListener('resize', handleResize)
})

onUnmounted(() => {
  chart?.dispose()
  window.removeEventListener('resize', handleResize)
})
</script>

<style scoped>
.dashboard-container {
  width: 100%;
  height: 80%;
  background-color: #222939;
  display: flex;
  align-items: center;
  justify-content: center;
}

.gauges-chart {
  width: 100%;
  height: 100%;
  min-height: 600px;
}

@media screen and (max-width: 768px) {
  .gauges-chart {
    min-height: 400px;
  }
}
</style>

运行效果

当你将这些代码集成到你的 Vue 3 项目中并运行时,你将看到一个包含多个仪表盘的界面,每个仪表盘显示不同的数据(如电压、电流、功率因数等)。每个仪表盘的数据是通过 ECharts 的 gauge 图表类型来呈现的,同时也使用了颜色和样式定制,以增强视觉效果。

总结

通过本文的示例,你已经学会了如何在 Vue 3 中使用 ECharts 实现一个简单的仪表盘。我们结合了 Vue 3 的 Composition API 和 ECharts 提供的 gauge 图表类型,展示了如何在实际项目中创建动态、可交互的仪表盘。你可以根据需要扩展功能,例如定期更新数据、添加动画效果等。

希望这篇文章对你有所帮助!如果你有任何问题或建议,欢迎在评论区留言。


你可以将这篇文章发布到 CSDN 或其他平台。如果有任何细节需要修改或补充,


http://www.kler.cn/a/513318.html

相关文章:

  • kafka学习笔记7 性能测试 —— 筑梦之路
  • Python绘制数据地图-MovingPandas
  • 【Java面试】RabbitMQ
  • PyTorch使用教程(8)-一文了解torchvision
  • HDFS的Java API操作
  • 【LC】2239. 找到最接近 0 的数字
  • 99.10 金融难点通俗解释:投资资本回报率(ROIC)
  • MFC 使用 32位带Alpha通道的位图
  • Python配置MITMPROXY中间人监听配置
  • 解决HiveSQL查询出现Java.lang.OutMemoryError.java heap space
  • graylog~认识一下-日志管理平台
  • Freemarker和ItextPDF实际应用
  • GBase8c aes_encrypt和aes_decrypt函数
  • mysql的测试方案
  • P8738 [蓝桥杯 2020 国 C] 天干地支
  • Oracle 深入学习 Part 14:Managing Password Security and Resources(管理密码安全性和资源)
  • python中Mako用法
  • 深入探索Math.NET:开启高效数值计算之旅
  • C++通过输入3D相机像素点集{u、v、z}和机械手世界坐标点集{X、Y、Z}求得变换矩阵RT(眼在手外)
  • 将 Docker 安装到 Windows 的 D 盘的方法
  • 麦田物语学习笔记:保存和加载场景中的物品
  • StyleGAN - 基于样式的生成对抗网络
  • 低度酒真的是酒精勾兑的吗?
  • 2024人工智能AI+制造业应用落地研究报告汇总PDF洞察(附原数据表)
  • 【Java数据结构】排序
  • 前端之移动端