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

前言

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

实现效果

环境准备

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

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

    javascript 复制代码
    npm init vue@latest
  2. 安装 ECharts:在项目中安装 ECharts:

    javascript 复制代码
    npm install echarts

实现步骤

1. 创建 Vue 组件

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

javascript 复制代码
<!--
 * @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。

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

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

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


参考文档


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


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

相关推荐
yqcoder26 分钟前
Node.js 与 JavaScript 是什么关系
开发语言·javascript·node.js
贵州晓智信息科技1 小时前
Three.js实现动态水泡效果逐步解析GLSL着色器
开发语言·javascript·着色器
老K(郭云开)1 小时前
最新版Edge浏览器加载ActiveX控件技术——allWebPlugin中间件之awp_CreateActiveXObject接口用法
前端·javascript·chrome·中间件·edge
一点一木2 小时前
从零开始:使用 Brain.js 创建你的第一个神经网络(一)
前端·javascript·人工智能
小璇玑学前端2 小时前
微信小程序地图,定位,仿多多自提点
前端
我的div丢了肿么办2 小时前
vue3.5的更新保证你看的明明白白
前端·javascript·vue.js
愚z2 小时前
WorkboxWebpackPlugin 使用指南
前端
带多刺的玫瑰2 小时前
Leecode刷题C语言之统计打字方案数
javascript·数据结构·算法
m0_748248652 小时前
详细介绍Sd-WebUI提示词的语法规则
前端
南北极之间2 小时前
前端新手必看:10 大 UI 组件库全面解析,快速搭建高质量 Web 应用」 「从零开始:Vue 和 React 最受欢迎的 UI 组件库入门指南」 「超实用!PC 端和移动端 UI 组件库推荐与实战
前端·vue.js·ui·elementui·element·anti-design-vue·ui组件库