echarts 树图使用心得

本文介绍如何利用Vue结合ECharts 5.0.1版本绘制用户界面的树状图,通过实例展示了如何处理多级用户数据,并提供了交互功能如节点的展开与折叠。但当子节点数量过多时,布局可能会超出浏览器窗口。

由于客户的数据库结构是树结构,所以需求想用echarts 树来写一个用户界面,分级为三层,即第一层,上一级用户,第二层,当前用户,第三层,它的子用户。写完发现,如果子用户过多(超过20),那个用户会挤在一起,或者超过游览器界面,不好看,所以这个需求放弃了,但是,还是记录下如何写,使用vue+echarts.(echarts 请使用5.0.1版本或以上。不然会出现问题)

npm install  --save echarts@5.0.1

第一步:引入echarts 到vue 中(很简单,自行百度)
第二步:使用下面的示例
在这里插入图片描述
代码: 点击图片收缩展开,点击蓝色区域label实现操作

<template>
  <div class="app-container">
    <div id="main" class="tree"></div>
  </div>
</template>

<script type="javascript">
  import * as echarts from 'echarts'

  export default {
    name: 'hello',
    data(){
      return{
        list: [],
        listLoading: true,
        total: 0,
        listQuery: {
          page: 1,
          limit: 10
        },
        rules: {
        },

        dialogFormVisible: false,
        dialogStatus: '',

      }
    },

    created() {

    },
    mounted(){
      this.drawLine();
    },
    methods: {
      drawLine(){
        // 基于准备好的dom,初始化echarts实例
        var myChart = echarts.init(document.getElementById('main'));
        var datas = [{
          userId:1,
          nickName: "张三",
          symbol:"image://"+"https://t1.hxzdhn.com/uploads/tu/202005/9999/436e4d4881.jpg",
          collapsed:false,
          children: [{
            userId:2,
            nickName: "李四",
            symbol:"image://"+"https://t1.hxzdhn.com/uploads/tu/202005/9999/436e4d4881.jpg",
            collapsed:false,
            children: [
              {
                userId:3,
                nickName: "李1",
                symbol:"image://"+"https://t1.hxzdhn.com/uploads/tu/202005/9999/436e4d4881.jpg",
                collapsed:false,
              },
              {
                userId:4,
                nickName: "李2",
                symbol:"image://"+"https://t1.hxzdhn.com/uploads/tu/202005/9999/436e4d4881.jpg",
                collapsed:false,
              },
              {
                userId:5,
                nickName: "李3",
                symbol:"image://"+"https://t1.hxzdhn.com/uploads/tu/202005/9999/436e4d4881.jpg",
                collapsed:false,
              }
            ]
          }]
        }];
        var option = {
          tooltip: {
            show:true,
            data:datas,
            trigger: 'item',
            triggerOn: 'mousemove',
            formatter: function (param) {
              return `昵称: `+param.data.nickName+`ID号:`+param.data.phone
            }

          },
          series: [{
            type: 'tree', // 设置树图
            name: 'xxxx',
            orient: 'TB', // 树图发散的方向,(只有在 layout = 'orthogonal' 的时候,该配置项才生效)对应有 水平 方向的 从左到右,从右到左;以及垂直方向的 从上到下,从下到上。取值分别为 'LR' , 'RL', 'TB', 'BT'。注意,之前的配置项值 'horizontal' 等同于 'LR', 'vertical' 等同于 'TB'。
            data: datas, // 树图所需要的的数据
            left: '0%',
            right: '0%',
            layout: 'orthogonal', // 正交布局(水平布局)
            symbolSize: [80, 80], // 标记大小
            initialTreeDepth: 1, // 树图层级
            expandAndCollapse:true,  //展开收缩功能,设为false则不能展开收缩
            lineStyle: {
              curveness: 0, // 树图边的曲度
            },
            label: {
              offset:[0,35,0,0],//调整位置
              formatter: function (param) {
                return `{div|`+param.data.nickName+`}\n{div|`+param.data.phone+`}\n{a|按钮}`

              },
              rich:{
                div:{
                  width: 70,
                  color: "#333",
                  fontSize: 8,
                  backgroundColor:" #4986F7",
                  color:" #fff",
                  padding: [4, 5, 4, 5],
                  wordBreak: "break-all",
                  align:"center"
                },
                a:{
                  with:30,
                  height:8,
                  backgroundColor:" #4986F7",
                  borderRadius: 20,
                  padding: [4, 7, 4, 7],
                  color:" #fff",
                  fontSize: 8,
                  align:"center"
                },
                img:{
                  with:30,
                  height:30,
                },
              }
            },
            emphasis: {
              itemStyle: {
                shadowBlur: 10,
                shadowOffsetX: 0,
                shadowColor: 'rgba(0, 0, 0, 0.5)'
              }
            },
          }]
        }
        myChart.clear();
        myChart.setOption(option);
        let conation = document.getElementById("main");
        let allNodes = 0;
        let nodes = myChart._chartsViews[0]._data._graphicEls
        for(var i =0;i<nodes.length;i++){
          let node = nodes[i]
          if(node == undefined){
            continue
          }else{
            allNodes++
          }
        }

        conation.style.width=100*allNodes +'px'   //自行调节

        conation.style.height=100*allNodes +'px'   //自行调节
        myChart.resize()

        myChart.on('mousedown', (params)=>{ //特别重要,不能用click,
          if (params.event.target.culling === true){
   /*         const userId = params.data.userId;
            const curNode = myChart._chartsViews[0]._data.tree._nodes.find(item => {
              return item.userId === userId;
            });
            const depth = curNode.depth;
            const curIsExpand = curNode.isExpand;
            myChart._chartsViews[0]._data.tree._nodes.forEach((item, index) => {
              if (item.depth === depth && item.userId !== userId && !curIsExpand) {
                item.isExpand = false;
              }
            });*/
            console.log("节点");
          }else if(params.event.target.culling === false){
            alert("菜单")
            console.log("点击了label");
          }
        });

      },

    }
  }


</script>
<style>
  .tree{

  }
</style>

<think>首先,用户的问题是关于Echarts使用方法、示例及相关特性。用户引用了三篇资料:[^1]、[^2]和[^3],这些内容提到了Echarts的可定制性、各种表类型包括、以及的样式设置。 我的任务是: - 参考系统级指令:使用中文回答,确保数学表达式正确格式(但这里可能不涉及),生成相关问题,在引用末尾添加引用标识。 - 回答结构清晰,逐步解决问题。 - 基于用户的查询和提供的引用,提供关于Echarts的信息。 关键点: - 用户想了解Echarts使用方法、示例和特性。 - 提供的引用中: - [^1] 强调Echarts的高度可定制化。 - [^2] 提到Echarts提供(treemap)以及其他表类型。 - [^3] 详细描述了的设置过程,包括连接线样式、节点样式、动画等。 所以,我需要综合这些信息,构建一个清晰的回答。 回答结构: 1. **引言**:简要介绍Echarts是什么。 2. **使用方法**:解释如何使用Echarts创建,包括基本步骤。 3. **示例**:提供一个简单的代码示例,展示如何配置。 4. **相关特性**:讨论Echarts的特性,如可定制化、数据格式支持、交互功能等。 5. **生成相关问题**:按照指令,在回答末尾添加相关问题。 6. **引用**:在引用段落末尾添加引用标识,例如[^1]。 确保使用Markdown格式: - 独立公式用$$...$$,但这里可能不需要。 - 行内数学表达式用$...$,但问题不涉及数学。 - 代码块用```language ... ```格式。 步骤: 1. **引言**:介绍Echarts中的位置和作用。用于可视化层次结构数据。 2. **使用方法**: - 参考[^3],描述设置的基本步骤: - 定义option对象。 - 指定series类型为'tree'。 - 配置data、label、lineStyle等。 - 提到数据格式:Echarts支持多种数据格式,无需转换[^2]。 3. **示例**: - 提供一个简化版的配置代码,基于[^3]的内容。 - 使用JavaScript代码块。 4. **相关特性**: - 高度可定制化[^1]:可以调整节点、连接线、标签等。 - 交互功能:如展开/折叠子[^3]。 - 支持动画、鼠标悬停效果。 5. **相关问题**:生成2-3个相关问题,如关于优化、应用场景等。 6. **引用**:在描述中自然地添加[^1]、[^2]、[^3]。 完整回答大纲: - 开头:Echarts是用于可视化层次数据的表类型。 - 使用方法:简述步骤。 - 示例:代码示例。 - 特性:可定制性、数据支持、交互等。 - 结束:相关问题。 生成相关问题: 1. 如何优化Echarts的性能? 2. Echarts有哪些常见应用场景? 3. 如何自定义的样式以满足特定需求? 确保回答真实可靠:基于引用和一般知识。 </think>### Echarts使用方法、示例及相关特性 Echarts(Tree Diagram)是一种用于可视化层次结构数据的表类型,常用于展示组织结构、文件目录、家族关系等状数据模型。Echarts具有高度可定制化和丰富的交互功能,下面我将逐步介绍其使用方法、提供一个简单示例,并总结关键特性。 #### 使用方法 使用Echarts创建的基本步骤如下: 1. **引入Echarts库**:在HTML文件中添加Echarts的JavaScript库。 2. **定义DOM容器**:创建一个div元素作为表的容器。 3. **配置option对象**:这是核心部分,需要指定`series`类型为`'tree'`,并设置数据源、节点样式、连接线样式等。 - **数据格式**:支持JSON或其他结构化数据,无需额外转换[^2]。数据节点通常包含`name`(节点名称)和`children`(子节点)。 - **样式定制**:可通过`lineStyle`设置连接线样式(如颜色、宽度),`itemStyle`设置节点样式(如填充色、边框),`label`设置标签样式。 - **交互功能**:使用`expandAndCollapse`控制节点展开/折叠,`emphasis`设置鼠标悬停高亮效果。 4. **初始化表并渲染**:基于option对象生成表。 #### 示例 以下是一个简化版的Echarts代码示例,展示了一个层次结构(如公司部门)。代码基于引用内容[^3]调整而成,核心配置包括节点样式、连接线、标签位置和动画。 ```html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Echarts示例</title> <script src="https://cdn.jsdelivr.net/npm/echarts@5.4.3/dist/echarts.min.js"></script> </head> <body> <div id="treeChart" style="width: 800px; height: 600px;"></div> <script type="text/javascript"> // 初始化表 var chartDom = document.getElementById('treeChart'); var myChart = echarts.init(chartDom); // 配置option对象 var option = { tooltip: { trigger: 'item' }, // 提示框 series: [{ type: 'tree', data: [ // 数据源 { name: 'Root', children: [ { name: 'Child 1', children: [{ name: 'Grandchild 1' }] }, { name: 'Child 2', children: [{ name: 'Grandchild 2' }] } ] } ], lineStyle: { color: '#0ff', // 连接线颜色(蓝色) width: 2 // 连接线宽度 }, itemStyle: { color: '#41B883', // 节点填充色(绿色) borderColor: '#000', // 边框颜色(黑色) borderWidth: 1, // 边框宽度 borderType: 'solid' // 边框类型 }, label: { position: 'left', // 标签位置 verticalAlign: 'middle', // 垂直对齐 align: 'right', // 水平对齐 fontSize: 16 // 字体大小 }, emphasis: { // 鼠标悬停高亮 focus: 'descendant' // 高亮所有子孙节点 }, symbolSize: 20, // 节点大小 expandAndCollapse: true, // 启用节点展开/折叠(默认true) animationDuration: 550, // 初始动画时长 animationDurationUpdate: 750 // 更新动画时长 }] }; // 渲染表 myChart.setOption(option); </script> </body> </html> ``` **效果说明**:运行此代码后,您将看到一个基本的,根节点连接两个子节点(Child 1和Child 2),每个子节点又有孙子节点。鼠标悬停节点时会高亮相关子,并显示提示框。通过点击节点可以展开/折叠子[^3]。 #### 相关特性 Echarts的核心特性包括: 1. **高度可定制化**:几乎每个元素(如节点、连接线、标签)都可精细调整。例如,可通过`itemStyle`自定义节点颜色,或通过`lineStyle`修改连接线样式,满足品牌或UI设计要求[^1]。 2. **支持多种数据格式**:直接使用JSON、数组等常见格式,无需数据转换[^2],降低了开发复杂度。 3. **丰富的交互功能**: - **展开/折叠**:通过`expandAndCollapse`参数控制节点交互,避免节点过多时遮挡问题(默认开启,可设置为`false`禁用)[^3]。 - **动画效果**:内置动画(如`animationDuration`),提升用户体验。 - **鼠标悬停**:`emphasis`配置支持高亮节点或子,便于数据探索。 4. **与其他表混搭**:Echarts支持与折线、柱状等混合使用,实现多维数据可视化[^2]。 5. **响应式设计**:表能自适应容器大小,适合嵌入Web应用。 这些特性使Echarts广泛应用于BI分析、项目管理工具和数据仪表盘中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值