最近项目中使用到echarts的树操作,对其中几点注意事项进行下总结。

效果图:



1、基础配置

options的配置如下:

{
tooltip: {
trigger: 'item',
triggerOn: 'mousemove'
},
series: [
{
type: 'tree',
data: data,
orient: 'TB',
symbolSize: 20,
label: {
normal: {
position: 'left',
verticalAlign: 'middle',
align: 'right',
fontSize: 12,
rotate: 45,
formatter (data) {
let { name } = data;
return name.length > 7
? name.substring(0, 7) + '...'
: name;
}
}
},
leaves: {
label: {
normal: {
position: 'right',
verticalAlign: 'middle',
align: 'left',
rotate: 45
}
}
},
itemStyle: {
normal: {
borderColor: '#1890ff'
}
},
expandAndCollapse: true,
animationDuration: 550,
animationDurationUpdate: 750
}
]
}

1.1 文字倾斜

label选项设置rotate属性

label:{
rotate: 45
}

1.2 竖式显示

设置orient选项,LR表示横向,TB表示纵向

{
type: 'tree',
orient:'TB'
}

1.3 省略显示

当字数过多的时候显示...在labelformatter中进行设置

label:{
normal:{
formatter (data) {
formatter (data) {
let { name } = data;
return name.length > 7 ? name.substring(0, 7) + '...' : name;
}
}
}

2、交互说明

当点击【显示关系】的时候,显示图中的黄色边框节点。

看下关系数据:

节点【罗拉】的【朋友】是【quorra】和【heimayu】

我们需要做的就是抽取关系数据并塞入到原来树的节点中,分析逻辑并显示代码:

2.1 在原来树的节点中找到节点【罗拉】

// 获取接口返回的数据
let relations = res.conceptRelationDTOS; // 对关系数组进行识别,this.relationTreeList是原来树的数据
relations.forEach((item, index) => {
this.findRelationNode(item, this.relationTreeList);
});

递归树数据找到节点

/**
* 在 list 中找到 dataId 并塞入关系relationDTO
* @param data 关系数据
* @param list 树数据
*/
findRelationNode (data, list) {
for (var i = 0, len = list.length; i < len; i++) {
let id = data.id;
if (id === list[i].id) {
this.setRelationNode(data, list[i]);
break;
} else if (list[i].children && list[i].children.length > 0) {
this.findRelationNode(data, list[i].children);
}
}
}

2.2 找到节点【罗拉】后,塞入孩子节点(关系)

/**
* 设置孩子节点
* @param data 关系数据
* @param node 塞入的节点
*/
setRelationNode (data, node) {
let { conceptRelations } = data;
if (!conceptRelations.length) {
return;
}
conceptRelations.forEach(item => {
let { relationName, concepts } = item; node.children.push({
id: new Date().getTime() * Math.random(),
name: `关系:${relationName}`,
children: concepts,
itemStyle: {
borderColor: '#faa221' // 对节点颜色设置
}
});
});
}

这里要注意的是,保证设置的id的唯一性,不然会对树的显示渲染有影响

3、重绘缓存影响

echarts在内部渲染树的时候会合并数据,我们这里需要点击显示关系进行切换,数据也是不停的切换的,由于数据的耦合度较高导致树渲染的过程中出现了问题。这里我的解决方法是:

1、设置setOption的第二个参数true,第二个参数指的就是notMerger

this.treeChart.setOption(options,true)

2、在重新渲染前清除画布,方法是clear()

this.treeChart.clear();

亲测有效。

关于echarts绘制树图形的注意事项(文字倾斜、数据更新、缓存重绘问题等)的更多相关文章

  1. Canvas绘制不规则图形,实现可拖动,编辑--V1.0第一篇

    目前的工作在做在线的标注工具,接触canvas一年了,各种绘制,基本上图像的交互canvas都可以完成,也写了几篇关于canvas的文章,遇到的问题也写博客上了,对于canvas有问题的朋友可以去看看 ...

  2. 10 个超炫绘制图表图形的 Javascript 插件【转载+整理】

    原文地址 现在,有很多在线绘制图表和图形(Charts and Graphs)的 JavaScript 插件,这些插件还都是免费,以及图表库.这些插件大量出现的原因是基于一个事实:人们不再依赖于 Fl ...

  3. 基于easyUI实现权限管理系统(一)一—组织结构树图形

    此文章是基于 EasyUI+Knockout实现经典表单的查看.编辑 一. 相关文件介绍 1. organize.jsp:组织结构树的主界面 <!DOCTYPE html PUBLIC &quo ...

  4. 使用echarts绘制条形图和扇形图

    使用echarts绘制条形图和扇形图 简单举例说明下echarts如何绘制条形图和扇形图 代码示例 <!doctype html> <html lang="en" ...

  5. 学习笔记:HTML5 Canvas绘制简单图形

    HTML5 Canvas绘制简单图形 1.添加Canvas标签,添加id供js操作. <canvas id="mycanvas" height="700" ...

  6. css绘制特殊图形,meida查询,display inline-box间隙问题以及calc()函数

    本文同时发表于本人个人网站 www.yaoxiaowen.com 距离上一篇文章已经一个月了,相比于写代码,发现写文章的确是更需要坚持的事情.言归正传,梳理一下这一个月来,在写ife任务时,有必要记录 ...

  7. 使用Ogre::ManualObject 绘制自定义图形

    在ogre中如果需要进行自定义图形绘制可以使用ManualObject.例如绘制一个三角形的用法如下: SceneNode* pGridNode = m_pBaseNode->createChi ...

  8. 摘记 史上最强大的40多个纯CSS绘制的图形(一)

    今天在国外的网站上看到了很多看似简单却又非常强大的纯CSS绘制的图形,里面有最简单的矩形.圆形和三角形,也有各种常见的多边形,甚至是阴阳太极和网站小图标,真的非常强大,分享给大家. Square(正方 ...

  9. 40多个纯CSS绘制的图形

    本文由码农网 – 陈少华原创,转载请看清文末的转载要求. 今天在国外的网站上看到了很多看似简单却又非常强大的纯CSS绘制的图形,里面有最简单的矩形.圆形和三角形,也有各种常见的多边形,甚至是阴阳太极和 ...

随机推荐

  1. 数据分析:pandas 基础

    pandas 是基于 Numpy 构建的含有更高级数据结构和工具的数据分析包 类似于 Numpy 的核心是 ndarray,pandas 也是围绕着 Series 和 DataFrame 两个核心数据 ...

  2. How to manage local libraries in IntelliJ IDEA

    如何在 IntelliJ IDEA 中管理本地类库 一般来说,如果项目是基于 Maven 管理工具的,我们会在 pom.xml 中添加 dependency 来管理依赖.但有时也会遇到要用的类库不在 ...

  3. 12个值得关注的顶级可视化JS库 涉及图表、动画、时间处理,表格操作

    本文是译文,原文是https://da-14.com/blog/top-11...我在原文的基础上加了百度的Echats图表库,这个也是毫不逊色其他图表库的.另外Handsontable电子表格库也是 ...

  4. Object中的方法以及对象相等的判定

    看图说话 Object有以下几个方法 getClass() final类型,主要是用来获得运行时的类型 hashCode() 返回该对象的哈希码值,方法是为了提高哈希表(例如 java.util.Ha ...

  5. CentOS7 安装 Adobe Flash 看网络视频

    登录 Adobe 网站,找到 Adobe Flash Player 下载页,进入后网页自动识别 Linux 环境,手动选择版本,选择 YUM 方式,自动下载一个 rpm 文件 定位到下载目录,通常默认 ...

  6. 使用go写一个简单的exe文件

    工作需要一个小工具给分析师用,原先打算写一个脚本的,但是呢我又不会用python,要写的话只能用java来实现(打包成可执行jar,使用java -jar 的命令来执行,当然得安装jdk).这种命令行 ...

  7. java ListNode链表数据结构

    class ListNode{ int val; ListNode next; } 该节点的值 val.   下一个节点  next

  8. js实现瀑布流布局

    window.onload = function () { var d1 = new Waterfall(); d1.init();};//构造函数function Waterfall() { thi ...

  9. Mac 10.12安装Office 2011

    说明:由于WPS没有Mac版的,所以只能装这个,这个版本是2011的,基本够用了. 下载: (链接: https://pan.baidu.com/s/1pKGvXBP 密码: irw9)

  10. http协议与他的三次握手和四次挥手

    http:超文本传输协议,在客户端与服务端之间传输信息,客户端发送html,css给服务器,服务器返回源码给客户端: https:是一种更安全的传输协议,在协议上加了一层密码,不容易被黑客攻击,更加安 ...