我正在参加「掘金·启航计划」
系列文章:
- 手摸手使用G6实现(轻)图编辑应用系列-初识G6
- 手摸手使用G6实现(轻)图编辑应用系列-自定义节点
- 手摸手使用G6实现(轻)图编辑应用系列-自定义边、箭头
- 手摸手使用G6实现(轻)图编辑应用系列-自定义行为
- 手摸手使用G6实现(轻)图编辑应用系列-后续优化
前言
前四节基本把必要的功能已经实现完成,此节实现一些有必要的优化
优化一
节点间多条线时箭头会重叠,偶尔还会存在箭头交叉问题
箭头重叠
箭头交叉
- 优化思路
- 所有起点终点都设置为圆心,利用边的控制点制造恰当的弯曲程度,来满足大部分场景
- 具体过程
- 使用图配置linkCenter设置边连入节点中心
- 设置后发现箭头不再存在,将节点透明度调低,发现其实是被节点遮挡
- 自定义箭头中提到箭头可以实现偏移,可通过偏移移动到节点边缘
- 注:自环边比较特殊,设置linkCenter后,并不会连接节点中心,不需要额外进行箭头偏移
优化二
配置fitView后,当画布上节点数很少会自适应容器,导致节点变得很大,不美观
- 优化思路
- 不再配置fitView,采用图渲染后,手动调用graph的fitView方法
- 注:尽量不要看国内镜像的G6官方文档,很多没有同步,描述的不全(除非看源码才能知道)
graph.once('afterrender', e => {
graph.fitView(20, { onlyOutOfViewPort: true });
})
优化三
画布自适应
- 优化思路
- 通过监听窗口变化事件,来获取容器dom宽高,实时调用graph的changeSize方法
优化四
画布背景设置后不显示
- 优化思路
- 查看dom层级发现是背景元素层级太低
- 进行css样式覆写
.container{
width: 100%;
height: 100%;
position: relative;
/deep/.g6-grid-container{
z-index: 0 !important;
}
/deep/canvas{
position: relative;
}
}
优先五
大量节点、线状态变化时,性能问题
- 优化思路
- 默认G6会在更新、删除后触发自动重绘;此处,采用合并操作一同操作的思路
graph.on('node:mouseenter', (ev) => {
// 关闭自动重绘
graph.setAutoPaint(false);
// 状态变化操作
.....
// 手动触发绘制
graph.paint();
// 开启自动重绘
graph.setAutoPaint(true);
});
结尾
截至到此,G6实现(轻)图编辑到一段落;后续有新功能以及优化也会继续更新,第一次使用G6实现功能,有错误欢迎大家评论指正
希望看完的朋友可以点个喜欢/关注,您的支持是对我最大的鼓励