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

11.在 Vue 3 中使用 ECharts 实现树状图

前言

在前端开发中,数据可视化是一个非常重要的领域。ECharts 是一个由百度开源的强大图表库,支持多种图表类型,包括折线图、柱状图、饼图以及树状图等。本文将详细介绍如何在 Vue 3 项目中集成 ECharts,并实现一个树状图(Tree Chart)。

实现效果

环境准备

在开始之前,确保你已经完成以下准备工作:

  1. 安装 Vue 3:如果你还没有创建 Vue 3 项目,可以使用以下命令创建一个新项目:

    npm init vue@latest

  2. 安装 ECharts:在项目中安装 ECharts:

    npm install echarts

实现步骤

1. 创建 Vue 组件

首先,我们创建一个 Vue 组件来承载树状图。以下是一个完整的代码示例:

<!--
 * @Author: 彭麒
 * @Date: 2025/1/18
 * @Email: 1062470959@qq.com
 * @Description: 此源码版权归吉檀迦俐所有,可供学习和借鉴或商用。
 -->
<template>
  <div class="w-full justify-start flex h-[180px] items-center pl-10">
    <BackButton @click="goBack"/>
  </div>
  <div class="font-bold text-[24px]">在Vue3中使用Echarts实现树状图</div>
  <div class="chart-container">
    <div ref="chartRef" class="tree-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 data = {
  name: "flare",
  children: [{
    name: "animate",
    symbolSize: 16,
    label: {
      fontSize: 16,
      color: "#000"
    },
    itemStyle: {
      color: "#ff0000",
      borderColor: '#0000ff',
      borderWidth: 3,
      normal: {
        color: "#00ff00"
      }
    },
    lineStyle: {
      color: "#888",
      width: 4,
      type: 'dotted'
    },
    children: [
      {
        name: "Easing",
        value: 17010
      },
      {
        name: "FunctionSequence",
        value: 5842
      },
      {
        name: "interpolate",
        children: [
          {
            name: "ArrayInterpolator",
            value: 1983
          },
          {
            name: "ColorInterpolator",
            value: 2047
          },
          {
            name: "DateInterpolator",
            value: 1375
          },
          {
            name: "Interpolator",
            value: 8746
          },
          {
            name: "MatrixInterpolator",
            value: 2202
          }
        ]
      },
      {
        name: "ISchedulable",
        value: 1041
      },
      {
        name: "Parallel",
        value: 5176
      },
      {
        name: "Pause",
        value: 449
      }
    ]
  },
    {
      name: "data",
      category: "tree2",
      label: {
        normal: {
          show: true
        }
      },
      itemStyle: {
        normal: {
          show: false,
          color: {
            type: 'radial',
            x: 0.5,
            y: 0.5,
            r: 0.5,
            colorStops: [{
              offset: 0,
              color: 'green'
            }, {
              offset: 1,
              color: 'white'
            }],
            globalCoord: false
          },
          borderColor: 'blue',
          borderWidth: 2,
          shadowColor: 'rgba(0, 0, 0, 1)',
          shadowBlur: 10
        },
        emphasis: {
          color: {
            type: 'radial',
            x: 0.5,
            y: 0.5,
            r: 0.5,
            colorStops: [{
              offset: 0,
              color: 'green'
            }, {
              offset: 1,
              color: 'white'
            }],
            globalCoord: false
          }
        }
      },
      children: [
        {
          name: "converters",
          children: [
            {
              name: "Converters",
              value: 721
            },
            {
              name: "DelimitedTextConverter",
              value: 4294
            },
            {
              name: "GraphMLConverter",
              value: 9800
            },
            {
              name: "IDataConverter",
              value: 1314
            },
            {
              name: "JSONConverter",
              value: 2220
            }
          ]
        },
        {
          name: "DataField",
          value: 1759
        },
        {
          name: "DataSchema",
          value: 2165
        }
      ]
    }]
}

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

  chart = echarts.init(chartRef.value)

  const option = {
    tooltip: {
      trigger: 'item',
      triggerOn: 'mousemove'
    },
    series: [{
      type: 'tree',
      initialTreeDepth: -1,
      data: [data],
      top: '1%',
      left: '7%',
      bottom: '1%',
      right: '20%',
      symbolSize: 10,
      label: {
        normal: {
          position: 'left',
          verticalAlign: 'middle',
          align: 'right',
          color: 'black'
        }
      },
      leaves: {
        label: {
          normal: {
            position: 'right',
            verticalAlign: 'middle',
            align: 'left',
          }
        },
        itemStyle: {
          normal: {
            color: {
              type: 'radial',
              x: 0.5,
              y: 0.5,
              r: 0.5,
              colorStops: [{
                offset: 0,
                color: 'red'
              }, {
                offset: 1,
                color: 'blue'
              }],
              globalCoord: false
            }
          }
        }
      }
    }]
  }

  chart.setOption(option)
}

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

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

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

<style scoped>
.chart-container {
  width: 70%;
  margin-left: 10%;
  height: 70%;
  min-height: 600px;
}

.tree-chart {
  width: 100%;
  height: 100%;
}

@media screen and (max-width: 768px) {
  .chart-container {
    min-height: 400px;
  }
}

@media screen and (max-width: 480px) {
  .chart-container {
    min-height: 300px;
  }
}
</style>

2. 代码解析

2.1 模板部分
  • 返回按钮: 使用 BackButton 组件实现返回功能。

  • 标题: 显示“在Vue3中使用Echarts实现树状图”。

  • 图表容器: 使用 ref 绑定一个 DOM 元素,用于渲染 ECharts 图表。

2.2 脚本部分
  • 数据定义data 是一个树状结构的数据,定义了节点的名称、子节点、样式等。

  • 初始化图表initChart 函数用于初始化 ECharts 实例,并设置图表的配置项。

  • 响应式调整handleResize 函数用于在窗口大小变化时调整图表大小。

  • 生命周期钩子: 在 onMounted 中初始化图表并监听窗口大小变化,在 onUnmounted 中销毁图表实例。

2.3 样式部分
  • 图表容器样式: 定义了图表容器的宽度、高度和最小高度,并设置了响应式布局。

3. 运行效果

完成代码后,运行项目,你将看到一个树状图展示在页面上。鼠标悬停在节点上时,会显示节点的详细信息。窗口大小变化时,图表会自动调整大小。

4. 总结

本文详细介绍了如何在 Vue 3 项目中集成 ECharts 并实现一个树状图。通过本文的学习,你可以掌握以下技能:

  • 在 Vue 3 中使用 ECharts。

  • 实现树状图的基本配置和样式定制。

  • 处理图表的响应式布局。

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


参考文档

  • ECharts 官方文档

  • Vue 3 官方文档


版权声明:本文代码版权归吉檀迦俐所有,可供学习和借鉴或商用。


希望这篇博文对你有帮助!如果有其他需求,欢迎随时提出!


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

相关文章:

  • TiDB 和 MySQL 的关系:这两者到底有什么不同和联系?
  • 设计模式-单例模式
  • 前端实习第二个月小结
  • Navicat 17 功能简介 | 商业智能 BI
  • 二叉树总结(hot100)
  • Java 视频处理:基于 MD5 校验秒传及 ffmpeg 切片合并的实现
  • vue中的那些事(刷新+key+v-if,v-for)
  • Python制作简易PDF查看工具PDFViewerV1.0
  • 自建本地Linux、PHP服务部署并验证
  • python编程-OpenCV(图像读写-图像处理-图像滤波-角点检测-边缘检测)图像变换
  • STM32 学习笔记【补充】(十)硬件I2C读写MPU6050
  • 微调Qwen2.5-0.5B记录
  • 西门子PLC读取梅安森烟雾传感器数据
  • 5. 使用springboot做一个音乐播放器软件项目【业务逻辑开发】
  • 分布式理解
  • SiamCAR(2019CVPR):用于视觉跟踪的Siamese全卷积分类和回归网络
  • app版本控制java后端接口版本管理
  • Spring Boot 中使用 ShardingSphere-Proxy
  • SpringBoot 项目中配置日志系统文件 logback-spring.xml 原理和用法介绍
  • 数字化的三大战场与开源AI智能名片2+1链动模式S2B2C商城小程序源码的应用探索
  • javaEE安全开发 SQL预编译 Filter过滤器 Listener 监听器 访问控制
  • Delete `␍`eslintprettier/prettier
  • 【Linux】14.Linux进程概念(3)
  • 一个好用的vue+node后台管理系统
  • -bash: /java: cannot execute binary file
  • JS宏进阶:正则表达式介绍