!!!###!!!title=事件——VisActor/VGraph 教程文档!!!###!!!!!!###!!!description=vgraph 共有三种粒度的事件,满足不同场景下的交互需求。分别是- 关系图级:对应 Graph 和 TreeGraph 事件。- 实例级:对应 Node, Edge, Group 实例的事件- 图形级:对应视觉上组成每种实例的基本图形对象事件事件会从图形上冒泡到实例再到 graph。例如用户点击了节点上的一个 icon,依次会触发:- icon 的 click 事件- node 的 click 事件- graph 的 node:click 事件- graph 的 click 事件<p><img src="/vgraph/guide/event.png" width="400"></p>vgraph 事件对象组成如下:```typescriptconst e = { // 事件类型,例如 click, mouseenter type: string; // 作用的目标对象,往往与上述的事件粒度对应 target: Graph | Node | Edge | Group | Shape; // 事件的目标对象相关的节点,就是真正触发事件的图形对象。仅在 graph 事件和实例事件存在 relatedTarget: Shape; // 事件触发时鼠标指针相对于浏览器视口左上角的的水平x坐标和垂直y坐标 clientX: number; clientY: number; // 浏览器原生事件 nativeEvent: Event; // 阻止事件冒泡 stopPropagation(): void;};```!!!###!!!

事件

vgraph 共有三种粒度的事件,满足不同场景下的交互需求。分别是

  • 关系图级:对应 Graph 和 TreeGraph 事件。
  • 实例级:对应 Node, Edge, Group 实例的事件
  • 图形级:对应视觉上组成每种实例的基本图形对象事件

事件会从图形上冒泡到实例再到 graph。例如用户点击了节点上的一个 icon,依次会触发:

  • icon 的 click 事件
  • node 的 click 事件
  • graph 的 node:click 事件
  • graph 的 click 事件

vgraph 事件对象组成如下:

const e = {
    // 事件类型,例如 click, mouseenter
    type: string;
    // 作用的目标对象,往往与上述的事件粒度对应
    target: Graph |  Node | Edge | Group | Shape;
    // 事件的目标对象相关的节点,就是真正触发事件的图形对象。仅在 graph 事件和实例事件存在
    relatedTarget: Shape;
    // 事件触发时鼠标指针相对于浏览器视口左上角的的水平x坐标和垂直y坐标
    clientX: number;
    clientY: number;
    // 浏览器原生事件
    nativeEvent: Event;
    // 阻止事件冒泡
    stopPropagation(): void;
};

graph 事件

其中最常用的是 graph 级别的事件。在 graph 上可以分类对实例事件监听并做出反应,支持 node、edge、group 上的原生事件类型。事件格式为 ${entity.type}:${eventType}。例如定义节点点击事件为 graph.on('node:click', eventHandler)。目前支持的事件类型有:

  • click
  • dblclick
  • mouseenter
  • mouseleave
  • mouseover
  • mouseout
  • mousedown
  • mouseup
  • mousemove
  • contextmenu

由于实际业务中有很多与画布空白处交互的需求,graph 也设计了空白处交互事件事件,比如想监听点击空白处的事件,推荐使用 graph.on('canvas:click', callback)。 同时 graph 作为图的顶层容器,也可以直接监听原子事件,那么在图的任意位置发生相应事件都会触发。这时候可以通过 e.relatedTarget 来区分触发事件的对象。

除此之外 graph 实例上也支持交互粒度的事件,vGraph 导出了常量 GRAPH_EVENTS 方便引用。具体事件罗列如下

事件名称常量描述
changeGRAPH_EVENTS.CHANGE图中数据变更的通用事件,包括增删改图元,布局等
transformedGRAPH_EVENTS.TRANSFORMED图的视窗发生变化事件
changesizeGRAPH_EVENTS.CHANGE_SIZE更新画布大小事件
add:startGRAPH_EVENTS.ADD_START即将新增数据
add:endGRAPH_EVENTS.ADD_END新增数据完成
update:startGRAPH_EVENTS.UPDATE_START即将更新数据
update:endGRAPH_EVENTS.UPDATE_END更新数据完成
visibility:endGRAPH_EVENTS.VISIBILITY_END图元可见性发生变化
remove:startGRAPH_EVENTS.REMOVE_START即将删除数据
remove:endGRAPH_EVENTS.REMOVE_END删除数据完成
state:startGRAPH_EVENTS.STATE_START图元状态即将变化
state:endGRAPH_EVENTS.STATE_END图元状态已更新
state:startGRAPH_EVENTS.STATE_START图元状态即将变化,用于主动通过 setState 的方式更新状态
state:endGRAPH_EVENTS.STATE_END图元状态已更新,用于主动通过 setState 的方式更新状态
batchstate:startGRAPH_EVENTS.BATCH_STATE_START图元状态即将变化,用于监听编辑场景中批量场景,不会同时触发 state:start
batchstate:endGRAPH_EVENTS.BATCH_STATE_END图元状态已更新,用于监听编辑场景中批量场景,不会同时触发 state:end
layout:startGRAPH_EVENTS.LAYOUT_START即将重布局
layout:endGRAPH_EVENTS.LAYOUT_END布局完成
data:startGRAPH_EVENTS.DATA_START即将切换到新数据
data:endGRAPH_EVENTS.DATA_END已切换到新数据
updatedata:startGRAPH_EVENTS.UPDATE_DATA_START即将用新数据更新图
updatedata:endGRAPH_EVENTS.UPDATE_DATA_END用新数据更新图完成
clear:startGRAPH_EVENTS.CLEAR_START即将清除数据
clear:endGRAPH_EVENTS.CLEAR_END数据已清除
animationframeGRAPH_EVENTS.ANIMATION_FRAME动画帧刷新
animation:startGRAPH_EVENTS.ANIMATION_START开始动画
animation:endGRAPH_EVENTS.ANIMATION_END当前动画全部完成
draw:startGRAPH_EVENTS.DRAW_START即将重新渲染
draw:endGRAPH_EVENTS.DRAW_END渲染完成事件

实例事件

实例级别的事件就是监听单个实例并做出反应。例如 node.on('click', callback)。节点上的 click 事件会冒泡到 graph 上,因此 graph 上的 node:click 事件也会随后被触发。推荐用于单个节点特殊操作的情况。

图形事件

图形级别的事件多用于自定义节点,连线,分组的个性化图形交互操作。例如上述冒泡的例子,有些情况下点击 icon 不希望触发 node 级别的 click 事件等,就可以监听 icon 事件处理。