最近项目中使用到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. google Agent

    一句话:改HOSTS文件 有时候要查看appengine.google.com的后台,但死活上不去,怎么办?还是那个老办法: 1.在cmd下Ping www.google.com.hk,获得IP地址, ...

  2. 10分钟教你用Python打造天气机器人+关键字自动回复+定时发送

    01 前言 Hello,各位小伙伴.自上次我们介绍了Python实现天气预报的功能以后,那个小程序还有诸多不完善的地方,今天,我们再次来完善一下我们的小程序.比如我们想给机器人发“天气”等关键字,它就 ...

  3. Java多线程——volatile关键字、发布和逸出

    1.volatile关键字 Java语言提供了一种稍弱的同步机制,即volatile变量.被volatile关键字修饰的变量不会被缓存在寄存器或者对其他处理器不可见的地方,因此在每次读取volatit ...

  4. PS2模拟器 PCSX2 新手向

    1.模拟器的下载 1.1百度网盘地址:http://pan.baidu.com/s/1i3kt7bJ (已经整合了PS2BIOS的模拟器下载,比较新的版本,适合新手) 1.2高端玩家可以下载: 官网g ...

  5. OAuth2.0认证和授权以及单点登录

    https://www.cnblogs.com/shizhiyi/p/7754721.html OAuth2.0认证和授权机制讲解 2017-10-30 15:33 by shizhiyi, 2273 ...

  6. 利用scrapy-client发布爬虫的远程服务器

    一.环境准备 远程服务器必须装有scapyd,我们使用的机器必须有scrapy-client(我这里是windows),并确保这两者正常安装并启动. 二.客户端准备上传 首先进入到爬虫项目的根文件夹: ...

  7. 威尔逊定理--HDU2973

    参考博客 HDU-2973 题目 Problem Description The math department has been having problems lately. Due to imm ...

  8. masm32环境配置

    软件: Windows7-32bit visual c++6.0 Masm32 sdk 11 安装: 0x00 || 下载Masm sdk 11并安装,下载路径:http://www.masm32.c ...

  9. JavaScript中的不可变性(Immutability)

    什么是不可变性(Immutability)? 即某个变量在进行了某个操作之后,其本身没有发生变化,比如对于字符串而言,对字符串的任何操作都会改变字符串本身的值,而是在字符串的基础上复制出来一个然后再改 ...

  10. Linux下C++开发常用命令

    本页面记录本人在Linux下进行C++开发时使用的常用命令,注意这里不包括比如ls,mv等linux命令,这里会持续更新.首先假设你只有一个源程序文件,叫vec.cpp,编译后的可执行程序叫vec(本 ...