前端vue uni-app使用Vue和ECharts构建交互式树形结构图

news2025/4/22 11:28:03

题目:使用Vue和ECharts构建交互式树形结构图

摘要:本文介绍了如何使用Vue.js和ECharts构建一个交互式的树形结构图。通过整合ECharts的强大可视化功能,我们创建了一个可拖拽移动、点击展开和收缩的树形结构图,并实现了无限添加子集的功能。

图片

一、引言

随着数据可视化的快速发展,树形结构图作为一种常用的数据展示方式,被广泛应用于展示层次结构、关系网络和数据分类等场景。特别是在Web前端开发中,使用Vue.js等前端框架结合ECharts等可视化库,可以轻松实现树形结构图的交互式展示。

二、技术选型

  1. Vue.js:Vue.js是一款流行的前端框架,用于构建用户界面。它采用组件化的方式组织代码,使得前端开发更加模块化和可维护。

  2. ECharts:ECharts是一款使用JavaScript实现的开源可视化库,提供了丰富的图表类型和强大的交互功能。它能够方便地与Vue.js集成,实现数据驱动的可视化。

三、实现过程

  1. 安装依赖:首先,确保你的项目中已经安装了Vue.js和ECharts。你可以通过npm或yarn进行安装。例如,使用以下命令安装ECharts:

 

shell复制代码

npm install echarts --save
  1. 创建Vue组件:在Vue项目中,创建一个新的Vue组件用于承载树形结构图。在该组件的模板中,添加一个div元素作为ECharts图表的容器,并为其指定一个唯一的ID。

  2. 初始化图表:在Vue组件的mounted钩子函数中,初始化ECharts图表。首先获取容器的DOM元素,然后使用ECharts的init方法创建一个图表实例。接着,定义图表的配置项和数据。

  3. 配置树形图:在ECharts的配置项中,使用series属性配置树形图的数据。指定series的类型为"tree",并设置相应的数据和选项。例如,设置节点名称、颜色、子节点等。

  4. 实现交互功能:为了使树形图具有交互性,你可以使用ECharts提供的事件处理函数。例如,监听"click"事件来处理节点点击事件,实现展开或收缩节点的功能。同时,也可以监听"drag"事件来实现节点的拖拽移动功能。

  5. 无限添加子集:为了支持无限添加子集的功能,你可以在用户点击节点时动态生成新的子节点,并将其添加到树形图的数据中。然后重新渲染图表以显示新添加的子节点。

    实现代码如下:

    HTML代码部分
    复制代码<template>
        <view class="content">
    
            <view class="titleIos"></view>
    
            <div class="mui-content" style="margin-top: 16px;">
    
                <div id="container" style="height: 86vh; margin-top: 0px;"></div>
    
            </div>
    
        </view>
    </template>
    
    JS代码 (引入组件 填充数据)
    复制代码
    <script>
        import echarts from '../../static/h5/echarts.min.js'
    
        export default {
            data() {
                return {
    
                }
            },
            onReady() {
    
            },
            onLoad: function(e) {
                console.log(e);
    
            },
            onShow() {
    
            },
            mounted() {
                this.treeData()
            },
    
            methods: {
                treeData() {
    
                    var dom = document.getElementById("container");
                    var myChart = echarts.init(dom);
    
                    //  颜色设定 不同颜色寓意不同权重
                    var fatherColor = 'green';
                    var midColor = 'rgb(193, 92, 31)';
                    var smallColor = 'rgb(247, 203, 174)';
    
                    var option;
    
                    // 新能源汽车
                    let swyyQ = {
                        "name": "新能源汽车",
                        itemStyle: {
                            color: midColor
                        },
                        "children": [{
                                "name": "大型企业",
                                itemStyle: {
                                    color: fatherColor
                                },
    
                            },
                            {
                                "name": "中型企业",
                                itemStyle: {
                                    color: midColor
                                },
    
                            },
                            {
                                "name": "小型企业",
                                itemStyle: {
                                    color: smallColor
                                },
    
                            },
                            {
                                "name": "其他规模企业",
                                itemStyle: {
                                    color: fatherColor
                                },
                            }
                        ]
                    };
    
                    // 新材料行业
                    let xclkQ = {
                        "name": "生物与新医药",
                        itemStyle: {
                            color: fatherColor
                        },
                        "children": [{
                                "name": "大型企业",
                                itemStyle: {
                                    color: fatherColor
                                },
    
                            },
                            {
                                "name": "中型企业",
                                itemStyle: {
                                    color: midColor
                                },
    
                            },
                            {
                                "name": "小型企业",
                                itemStyle: {
                                    color: smallColor
                                },
    
                            },
                            {
                                "name": "其他规模企业",
                                itemStyle: {
                                    color: fatherColor
                                },
                            }
                        ]
                    };;
    
                    let data = {
                        "name": "行业分类",
                        itemStyle: {
                            color: fatherColor
                        },
                        "children": [swyyQ, xclkQ]
    
                    }
                    // 获取网页宽度 设置树形条目实体宽高度
                    let width = document.body.scrollWidth;
                    let widthSize = 0.039 * width;
                    if (widthSize > 36) {
                        widthSize = 36;
                    }
                    let heightSize = widthSize * 2.2;
    
                    myChart.setOption(
                        (option = {
                            tooltip: {
                                trigger: 'item',
                                triggerOn: 'mousemove'
                            },
                            series: [{
                                type: 'tree',
                                data: [data],
                                left: '2%',
                                right: '2%',
                                top: '8%',
                                bottom: '20%',
                                symbol: 'square',
                                symbolSize: [widthSize, heightSize],
                                orient: 'vertical',
                                expandAndCollapse: true,
                                initialTreeDepth: 2,
    
                                label: {
                                    position: 'top',
                                    rotate: 0,
                                    verticalAlign: 'middle',
                                    align: 'center',
                                    fontSize: 12
                                },
                                leaves: {
                                    label: {
                                        position: 'bottom',
                                        rotate: -90,
                                        verticalAlign: 'middle',
                                        align: 'left'
                                    }
                                },
                                animationDurationUpdate: 150
                            }]
                        })
                    );
    
                    if (option && typeof option === 'object') {
                        myChart.setOption(option);
                    }
    
                },
    
            }
    
        }
    </script>
    
    CSS
    复制代码
    <style>
        .content {
            display: flex;
            flex-direction: column;
    
        }
    </style>
    

四、注意事项

  1. 数据驱动:由于树形图的数据是动态的,因此需要确保数据的有效性和准确性。在添加或更新节点时,要确保数据的层次结构和关系正确。

  2. 性能优化:由于树形图的数据量可能很大,因此需要注意性能优化。可以通过使用虚拟化技术来减少不必要的渲染和计算,提高图表渲染的效率。

  3. 可读性和用户体验:在设计树形图时,要注意图表的排版和布局,使得图表易于理解和操作。同时,根据实际需求调整颜色、字体等样式,以提高用户体验。

五、总结

通过整合Vue.js和ECharts,我们可以轻松地构建一个交互式的树形结构图。这种图表在展示层次结构和关系网络时非常有用,可以帮助用户更好地理解和分析数据。同时,利用Vue.js和ECharts的强大功能和灵活性,我们可以根据实际需求定制化图表的功能和样式,以满足各种场景的需求。

 阅读全文下载完整组件代码请关注微信公众号: 前端组件开发

d848d5658a07453c843277846948c608.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1346125.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《Spring Cloud学习笔记:微服务保护Sentinel + JMeter快速入门》

Review 解决了服务拆分之后的服务治理问题&#xff1a;Nacos解决了服务治理问题OpenFeign解决了服务之间的远程调用问题网关与前端进行交互&#xff0c;基于网关的过滤器解决了登录校验的问题 流量控制&#xff1a;避免因为突发流量而导致的服务宕机。 隔离和降级&#xff1a…

Java EE Servlet之Servlet API详解

文章目录 1. HttpServlet1.1 核心方法 2. HttpServletRequest3. HttpServletResponse 接下来我们来学习 Servlet API 里面的详细情况 1. HttpServlet 写一个 Servlet 代码&#xff0c;都是要继承这个类&#xff0c;重写里面的方法 Servlet 这里的代码&#xff0c;只需要继承…

【数据结构】第2章线性表(头歌习题)【合集】

文章目录 第1关&#xff1a;实现顺序表各种基本运算的算法任务描述编程要求完整代码 第2关&#xff1a;实现单链表各种基本运算的算法任务描述编程要求完整代码 第3关&#xff1a;移除顺序表中所有值等于x的元素任务描述编程要求完整代码 第4关&#xff1a;逆置顺序表任务描述编…

穷举vs暴搜vs深搜vs回溯vs剪枝

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;那个传说中的man的主页 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;题目大解析&#xff08;3&#xff09; 目录 &#x1f449;&#x1f3fb;全排列&#x1f449;&#…

使用WSL

一、下载 Microsoft Store下载Ububtu&#xff0c;然后点击打开 二、报错WslRegisterDistribution failed with error: 0x800701bc 解决办法&#xff1a; 1、开启Windows Subsystem for Linux dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linu…

Unity之组件的生命周期

PS&#xff1a;第二天&#xff0c;依旧在摸鱼学unity 一、组件的概念 我本身是由Web后端转到了游戏后端&#xff0c;最近因为工作原因在学ET框架。学到了 ECS 编程模式开发&#xff08;E —— Entity&#xff0c;C —— Component &#xff0c; S —— System&#xff09;实体、…

玩转MYSQL|详细分析mysql-MGR集群搭建

目录 1、简介 2、环境准备 2.1 数据库服务器规划 2.2 安装mysql5.7.20 2.3 设置hostname和ip映射 3、创建复制环境 3.1 服务器host68.cn 3.1.1 配置/etc/my.cnf 3.1.2 服务器host68.cn上建立复制账号&#xff1a; 3.1.3 在mysql服务器host68.cn上安装group replicatio…

docker搭建minio集群,集群分享文件URL踩坑问题

一、环境准备 3台机器&#xff0c;Ip地址依次为IP1,IP2,IP3二、设置服务器时间同步 Minio集群需要各个节点的时间保持同步&#xff0c;使用NTP作为时间同步服务&#xff0c;这里以Minio-1&#xff08;IP1&#xff09;为上游服务器&#xff0c;其它2个节点为下游服务器&#x…

idea实现Java连接MySQL数据库

1.下载MySQL并安装 首先如果没有mysql的需要先下载MySQL&#xff0c;可以看这个教程&#xff1a; Mysql超详细安装配置教程(保姆级)_mysql安装及配置超详细教程-CSDN博客 2.下载mysql 的jdbc驱动 官网&#xff1a;MySQL :: Download Connector/J 解压并将驱动jar包导入id…

信息网络协议基础_IP移动网络管理

文章目录 概述移动IPv6待解决的问题关键词基本过程分组拦截技术移动检测和转交地址自动配置到家乡代理绑定注册通信对端不支持IPv6通信对端支持移动IPv6 对IP以上层屏蔽移动性 移动IPv6存在的问题移动IPv6优化代理移动IP概述原理基本过程初始接入切换 概述 移动IPv6 待解决的问…

证明:切线垂直于半径

证明&#xff1a; 切线垂直于过切点的半径。 下面是网上最简单的证明方法。 证明&#xff1a; 利用反证法。 如下图所示&#xff0c;直线AB和圆O切于点A&#xff0c;假设OA 不垂直于 AB&#xff0c;而 O B ⊥ A B OB \perp AB OB⊥AB&#xff0c;则 ∠ O B A 90 \angle OB…

Apache SSI 远程命令执行漏洞

一、环境搭建 二、访问upload.php 三、写shell <!--#exec cmd"id" --> 四、访问 如图所示&#xff0c;即getshell成功&#xff01;​

C#上位机与欧姆龙PLC的通信06---- HostLink协议(FINS版)

1、介绍 对于上位机开发来说&#xff0c;欧姆龙PLC支持的主要的协议有Hostlink协议&#xff0c;FinsTcp/Udp协议&#xff0c;EtherNetIP协议&#xff0c;本项目使用Hostlink协议。 Hostlink协议是欧姆龙PLC与上位机链接的公开协议。上位机通过发送Hostlink命令&#xff0c;可…

Spring Cloud Gateway集成Knife4j

1、前提 网关路由能够正常工作。 案例 基于 Spring Cloud Gateway Nacos 实现动态路由拓展的参考地址&#xff1a;Spring Cloud Gateway Nacos 实现动态路由 详细官网案例&#xff1a;https://doc.xiaominfo.com/docs/middleware-sources/spring-cloud-gateway/spring-gatewa…

使用anaconda创建爬虫spyder工程

1.由于每个工程使用的环境都可能不一样&#xff0c;因此一个好的习惯就是不同的工程都创建属于自己的环境&#xff0c;在anaconda中默认的环境是base&#xff0c;我们现在来创建一个名为spyder的环境&#xff0c;专门用于爬虫工程&#xff1a; //括号中名字&#xff0c;代表当…

【网络安全 | Misc】Aesop_secret(ISCC)

正文 动态gif&#xff0c;使用工具进行分解&#xff1a; https://tu.sioe.cn/gj/fenjie/ 得到ISCC字样 由Winhex看到密文&#xff1a; U2FsdGVkX19QwGkcgD0fTjZxgijRzQOGbCWALh4sRDec2w6xsY/ux53Vuj/AMZBDJ87qyZL5kAf1fmAH4Oe13Iu435bfRBuZgHpnRjTBn5xsDHONiR3t0Oa8yG/tOKJMN…

模式识别与机器学习-SVM(带软间隔的支持向量机)

SVM&#xff08;带软间隔的支持向量机&#xff09; 软间隔思想的由来软间隔的引入 谨以此博客作为复习期间的记录。 软间隔思想的由来 在上一篇博客中&#xff0c;回顾了线性可分的支持向量机,但在实际情况中&#xff0c;很少有完全线性可分的情况&#xff0c;大部分线性可分…

《末世少女/Zombie Girl》v1.0.0|容量13.6GB|官方简体介绍说明

《末世少女/Zombie Girl》v1.0.0|容量13.6GB|官方简体介绍说明 末世少女/Zombie Girl 一、游戏简介 《末世少女/Zombie Girl》是一款独特的第三人称射击游戏&#xff0c;以其惊心动魄的游戏体验、富有挑战性的丧尸战斗和深入的剧情探索而受到玩家们的热爱。这款游戏带领玩家进…

最优化方法Python计算:无约束优化应用——神经网络回归模型

人类大脑有数百亿个相互连接的神经元&#xff08;如下图(a)所示&#xff09;&#xff0c;这些神经元通过树突从其他神经元接收信息&#xff0c;在细胞体内综合、并变换信息&#xff0c;通过轴突上的突触向其他神经元传递信息。我们在博文《最优化方法Python计算&#xff1a;无约…

大模型推理部署:LLM 七种推理服务框架总结

自从ChatGPT发布以来&#xff0c;国内外的开源大模型如雨后春笋般成长&#xff0c;但是对于很多企业和个人从头训练预训练模型不太现实&#xff0c;即使微调开源大模型也捉襟见肘&#xff0c;那么直接部署这些开源大模型服务于企业业务将会有很大的前景。 本文将介绍七中主流的…