最近项目中使用到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 省略显示

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

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. 类型转换 / BOOL 类型

    /* Swift不允许隐式类型转换, 但可以使用显示类型转换(强制类型转换) OC: int intValue = 10; double doubleValue = (double)intValue; ...

  2. 厉害了,七牛云 CEO 来讲架构了!

    说起许式伟,你应该不陌生,他是七牛云的CEO,ECUG 社区发起人,国内 Go 语言圈的领军人物,曾就职于金山.盛大,有超过 10 年的搜索和分布式存储相关技术的研发经验. 他的个人经历颇为传奇,大学 ...

  3. 51nod1965. 奇怪的式子(min_25筛)

    题目链接 http://www.51nod.com/Challenge/Problem.html#!#problemId=1965 题解 需要求的式子显然是个二合一形式,我们将其拆开,分别计算 \(\ ...

  4. 【Alpha】Phylab 展示博客

    目录 Phylab Alpha 展示博客 一.团队简介 二.项目目标 2.1 典型用户 2.2 功能描述 2.3 用户量 三.项目发布与展示 3.1 新功能 3.2 修复缺陷 3.3 问题与限制 3. ...

  5. chainWebpack 和 htmlWebpackPlugin搭配使用

    const HtmlWebpackPlugin = require('html-webpack-plugin'); ... chainWebpack: config => { config .p ...

  6. 再学C/C++ 之 指针常量 和 常量指针

    (1)指针常量,将指针的指向当成常量.即指针变量的值只能在定义的时候初始化,定义后不能修改,也就是说不能改变指针变量的指向.但是不影响所指对象的访问特征.其定义形式为: 类型 * const 指针 / ...

  7. 什么是O/RMapping?为什么要用O/R Mapping?

    什么是O/R Mapping ? O/R Mapping 就是有一大堆的类库,我们调用它的时候用面向对象的方式来调,它帮我们翻译成为面向关系的方式. 为什么要用O/R Mapping? 我们编程会更加 ...

  8. guava学习:guava集合类型-Bimap

    学习guava让我惊喜的第二个接口就是:Bimap BiMap是一种特殊的映射其保持映射,同时确保没有重复的值是存在于该映射和一个值可以安全地用于获取键背面的倒数映射. 最近开发过程中,经常会有这种根 ...

  9. TreeMap红黑树

    Java TreeMap实现了SortedMap接口,也就是说会按照key的大小顺序对Map中的元素进行排序,key大小的评判可以通过其本身的自然顺序(natural ordering),也可以通过构 ...

  10. vue数组进行分组

    数组进行分组使用switch方法 <template> <v-layout> <v-card contextual-style="dark" v-if ...