一、前言

G6-Editor 是 AntV 官方提供的、专注于图可视化编辑器的类库,也是市面上完成度较高的图可视化编辑器。然而令人诟病的是其文档对新手极度不友好,我一度怀疑此文档只有他们自己开发人员才能看得懂,回首学习的过程里如同是漆黑中前行,苦不堪言。为了让后来者不重蹈覆辙,我愿化为萤火用微弱的光点指引前行的道路。

目标

1、组件使用

2、自定义节点

3、数据关联

4、自定义命令

开发环境

这里使用的框架是Vue,UI使用Element-ui,以及主角G6-Editor,建议clone文章最下面的github项目结合阅读。

二、进入实战

2.1Editor 是整个编辑器的主控类,其主要职责是将编辑器的各个组件协同起来。

用法:

import G6Editor from '@antv/g6-editor'
const editor = new G6Editor() // 元素面板栏 Itempannel
const itempannel = new G6Editor.Itempannel({
container: 'itempannel',
}) // 工具栏 Toolbar
const toolbar = new G6Editor. Toolbar({
container: 'toolbar',
}) // 详细面板 Detailpannel
const detailpannel = new G6Editor.Detailpannel ({
container: 'detailpannel'
}) // 缩略图 Minimap
const minimap = new G6Editor.Minimap({
container: 'minimap',
height: 226,
width: 226
}) // 组件挂载到Editor
editor.add(page)
editor.add(itempannel)
editor.add(toolbar)
editor.add(detailpannel)
editor.add(minimap)
复制代码

Tips:先实例化组件,然后再挂载到Editor

△ 以上。

工具栏

Toolbar 工具栏类,负责工具栏按钮的命令绑定、可用禁用状态控制。

G6-Editor内置了多种命令,亦可以自定义命令。

用法:

<!-- Toolbar -->
<div id="toolbar" class="toolbar">
<i data-command="delete" class="command el-icon el-icon-delete" title="删除"></i>
<i data-command="zoomIn" class="command el-icon el-icon-zoom-in" title="放大"></i>
<i data-command="save" class="command el-icon el-icon-upload" title="保存"></i>
</div>
复制代码
// Command
const Command = G6Editor.Command // 自定义Save命令
Command.registerCommand('save', {
// 命令是否进入队列,默认是 true
queue: false,
// 命令是否可用
enable(eidtor) {
return true
},
// 正向命令
execute(eidtor) {
// 获取当前page
const page = this.editor.getCurrentPage()
const data = page.save()
console.log(data)
},
// 快捷键:Ctrl+shirt+s
shortcutCodes : [['ctrlKey', 'shiftKey', 's']]
})
复制代码

Tips:工具栏的控件标签必须要有 data-command="delete"class="command"否则无效。其中delete为内置或自定义命令名称。

△ 以上。

Itempannel 元素面板栏,负责处理元素添加的通讯。

用法:

<!-- 元素面板栏 -->
<div id="itempannel" class="ph left">
<div class="getItem" data-type="node" data-shape="flow-rect" data-size="120*48" data-label="常规节点" data-color="#1890FF">
<img draggable="false" src="https://gw.alipayobjects.com/zos/rmsportal/wHcJakkCXDrUUlNkNzSy.svg" alt="" srcset="">
</div>
<div class="getItem" data-type="node" data-shape="flow-circle" data-size="72*72" data-label="起止节点" data-color="#FA8C16">
<img draggable="false" src="https://gw.alipayobjects.com/zos/rmsportal/ZnPxbVjKYADMYxkTQXRi.svg" alt="" srcset="">
</div>
<div class="getItem" data-type="node" data-shape="flow-rhombus" data-size="80*72" data-label="分叉节点" data-color="#13C2C2">
<img draggable="false" src="https://gw.alipayobjects.com/zos/rmsportal/SnWIktArriZRWdGCnGfK.svg" alt="" srcset="">
</div>
<div class="getItem" data-type="node" data-shape="flow-capsule" data-size="80*48" data-label="模型节点" data-color="#722ED1">
<img draggable="false" src="https://gw.alipayobjects.com/zos/rmsportal/rQMUhHHSqwYsPwjXxcfP.svg" alt="" srcset="">
</div>
<!-- 注意!我跟别人不一样,我是自定义的节点 -->
<div class="getItem" data-type="node" data-shape="customNode" data-size="80*48" data-label="我是自定义的" data-color="#722ED1">
<img draggable="false" src="https://user-gold-cdn.xitu.io/2019/3/15/169809645b016da6?w=114&h=128&f=png&s=1893" alt="" srcset="">
</div>
</div>
复制代码

自定义节点

// 注意!这里不能使用new G6Editor.Flow()的形式,是无效的。
// 应使用 const Flow = G6Editor.Flow
const Flow = G6Editor.Flow
Flow.registerNode('customNode', {
draw(item){
const group = item.getGraphicGroup()
const model = item.getModel()
group.addShape('text', {
attrs: {
x: 0,
y: 0,
fill: '#333',
text: model.label
}
})
group.addShape('text', {
attrs: {
x: 0,
y: 0,
fill: '#333',
text: ' ('+model.x+', '+model.y+') \n 原点是组的图坐标',
textBaseline: 'top'
}
}) return group.addShape('rect', {
attrs: {
x: 0,
y: 0,
width: 100,
height: 100,
stroke: 'red'
}
})
}
})
复制代码

class="getItem"的元素会被当做节点,可以往编辑器拖动。

data-* 所有 * 都会被设置进添加图项的数据模型。

data-type 元素类型

data-shape 元素图形

data-size 元素大小

data-label 元素标签

data-color 元素颜色

draggable 禁止、启动拖拽默认行为

△ 以上。

Detailpannel 属性栏类,负责属性栏显示隐藏的控制。通俗点说,就是不同的操作可以显示不同的面板。

用法:

  <!-- 详细面板 -->
<div id="detailpannel" class="detailpannel">
<div data-status="node-selected" class="panel" id="node_detailpanel">
<div class="panel-title">属性详情</div>
<div class="block-container">
<el-input v-model="nodeLabel" size="mini" @change="changeNodeLabel" placeholder="请输入内容"></el-input>
</div>
</div>
</div>
复制代码

data-status 标识不同页面状态下,各个右键菜单容器的显示隐藏。

<div data-status="node-selected">节点属性栏</div>
<div data-status="edge-selected">边属性栏</div>
<div data-status="group-selected">群组属性栏</div>
<div data-status="canvas-selected">画布属性栏</div>
<div data-status="multi-selected">多选时属性栏</div>
复制代码

△ 以上。

Minimap 缩略图类,负责绘制缩略图及双图联动。

  <!-- 缩略图 -->
<div class="minimap">
<div class="panel-title">缩略图</div>
<div id="minimap"></div>
</div>
复制代码

这个倒没什么好说的,可以参考官方的文档和实例。

△ 以上。

高能预警! 最后一个也是最重要的一个!数据关联!!!不和业务数据关联的一切都是耍流氓。

还记得Detailpannel属性栏类吗? 里面有一个输入框,事件绑定了changeNodeLabel,用来修改节点的label属性。

// methods
changeNodeLabel(value) {
const editor = this.editor
// 执行命令
editor.executeCommand(() => {
const page = editor.getCurrentPage()
const selectedItems = page.getSelected()
selectedItems.forEach(item => {
// 更新属性
page.update(item.id, {
label: value
})
})
})
}
复制代码

另外选择节点,也需要将label的值设置到输入框里。

// 获取当前page
const currentPage = editor.getCurrentPage()
// 监听选择变化
currentPage.on('afteritemselected', ev => {
// 选择对象为Node节点
if (ev.item.isNode) {
// 获取属性
const nm = ev.item.getModel()
_this.nodeLabel = nm.label
} // 选择对象为Edge节点
if (ev.item.isEdge) {
// 获取属性
const nm = ev.item.getModel()
_this.nodeLabel = nm.label
}
})
复制代码

△ 以上。

后话

由于代码段都是比较零散,最好结合下面提供在github上的项目食用,如果文章对你有帮助,请随手一个赞或者收藏。另外文章写得仓促有很多不足的地方,希望大家轻拍,哈哈哈~

github仓库 :github.com/leeggco/g6-…

这篇文章只提供了基础的知识,后续的进阶还是需要结合G6G6-editor的文档。

 
转载于:https://juejin.im/post/6844903797639102471

G6-Editor 编辑器入门使用教程的更多相关文章

  1. springboot+layui 整合百度富文本编辑器ueditor入门使用教程(踩过的坑)

    springboot+layui 整合百度富文本编辑器ueditor入门使用教程(踩过的坑) 写在前面: ​ 富文本编辑器,Multi-function Text Editor, 简称 MTE, 是一 ...

  2. sublimeText3编辑器 + 入门教程 + 使用大全

    sublimeText3编辑器 + 入门教程 + 使用大全 Ctrl+D选中光标所占的文本,继续操作则会选中下一个相同的的文本 ctrl+G:输入行号,可快速跳转该行 ctrl+p:输入冒号,在输入行 ...

  3. Python 零基础 快速入门 趣味教程 (咪博士 海龟绘图 turtle) 1. 神秘朋友

    Python (Windows 下) 自带了一个非常有趣的 海龟绘图程序 (turtle),它是本系列课程的主角. 在 PyCharm 中,新建一个项目,然后在代码编辑器中输入 import turt ...

  4. Python 零基础 快速入门 趣味教程 (咪博士 海龟绘图 turtle) 0. 准备工作

    一.关于 Python Python 是全球使用人数增长最快的编程语言!它易于入门.功能强大,从 Web 后端 到 数据分析.人工智能,到处都能看到 Python 的身影. Python 有两个主要的 ...

  5. duilib教程之duilib入门简明教程13.复杂控件介绍

    首先将本节要介绍的控件全部拖到界面上,并调整好位置,如图:  然后将Name属性改成其他名字,         不能是[控件名+UI+数字]这种,因为这是DuiDesigner默认的名字,它不会实际写 ...

  6. Angular2入门系列教程7-HTTP(一)-使用Angular2自带的http进行网络请求

    上一篇:Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数 感觉这篇不是很好写,因为涉及到网络请求,如果采用真实的网络请求,这个例子大家拿到手估计还要自己写一个web ...

  7. Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数

    上一篇:Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数 之前介绍了简单的路由以及传参,这篇文章我们将要学习复杂一些的路由以及传递其他附加参数.一个好的路由系统可以使我们 ...

  8. Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数

    上一篇:Angular2入门系列教程-服务 上一篇文章我们将Angular2的数据服务分离出来,学习了Angular2的依赖注入,这篇文章我们将要学习Angualr2的路由 为了编写样式方便,我们这篇 ...

  9. Angular2入门系列教程4-服务

    上一篇文章 Angular2入门系列教程-多个组件,主从关系 在编程中,我们通常会将数据提供单独分离出来,以免在编写程序的过程中反复复制粘贴数据请求的代码 Angular2中提供了依赖注入的概念,使得 ...

  10. ASP.NET Aries 入门开发教程7:DataGrid的行操作(主键操作区)

    前言: 抓紧勤奋,再接再励,预计共10篇来结束这个系列. 上一篇介绍:ASP.NET Aries 入门开发教程6:列表数据表格的格式化处理及行内编辑 本篇介绍主键操作区相关内容. 1:什么时候有默认的 ...

随机推荐

  1. 链接mysql数据库报错:2003-cant connect to Mysql server on ‘localhost’(10038)

    今天用navicat连mysql时候突然报错了 我百度了一下,知道了是mysql服务没开,但是我打开了服务,发现服务里面没有mysql,于是就去cmd以管理员身份打开命令提示符,切换到安装mysql的 ...

  2. Kubernetes--Pod节点选择器nodeSelector(标签)

    Pod节点选择器是标签及标签选择器的一种应用,它能够让Pod对象基于集群中工作节点的标签来挑选倾向运行的目标节点. Kubernetes的kube-scheduler守护进程负责在各工作节点中基于系统 ...

  3. STP理论基础

    目的 防止二层环路及防止环路造成的广播风暴以及引起的MAC表震荡 方法 首先,所有配置了STP的交换机互相向相邻交换器(配置了STP的)发送BPDU(协议数据单元),选举根桥(根交换机),根交换机上所 ...

  4. VUE3 API之watch与watchEffect

    watch(source,callback,options) 官方术语:侦听一个或多个响应式数据源,并在数据源变化时调用所给的回调函数. watchEffect(effect,options) 官方术 ...

  5. ES关闭打开索引

    转载: https://mp.weixin.qq.com/s?__biz=MzAxMjY5NDU2Ng==&mid=2651862931&idx=1&sn=5834af8065 ...

  6. 用FineBI实现hive图表的可视化

    图表的可视化,本来我以为很麻烦,因为看着图就感觉很难的样子,其实用FineBI来做很简单. 1.安装FineBI 2将下列jar包导入FineBI,webapps\webroot\WEB-INF\li ...

  7. IaaS--云虚拟机(一)(何恺铎《深入浅出云计算》笔记整理)

    [概念讲解] 云虚拟机的体系结构,就是全面解耦的计算存储分离的设计思想. 传统的虚拟化,往往是对单一物理机器资源的纵向切割,计算.存储.网络等各方面的能力都是一台物理机的子集.因此,从可伸缩性的角度来 ...

  8. [转载]OpenCV中的channel是什么意思?

    转载自https://answers.opencv.org/question/7585/meaning-of-channels/ 简单来说,就是描述一个pixel的颜色用多少个独立的参数描述,这个个数 ...

  9. Using Yocto Project with BeagleBone Black 英文版、Using Yocto Project with BeagleBone Black中文版

    Using Yocto Project with BeagleBone Black  手册英文版.中文版 https://market.m.taobao.com/app/idleFish-F2e/wi ...

  10. liunx设置QQ邮箱报警

    1.先安装一个软件包, 2.先登录电脑QQ邮箱->设置->账户->账户安全前两条选择开启,并生成授权码,授权码很重要很重要,千万不要泄露. 3.在liunx命令行输入  :vi /e ...