JavaScript is required

事件系统大全(RGListeners

relation-graph 通过 RGListeners 提供完整事件系统,用于监听图谱生命周期、节点/连线交互、画布行为和编辑流程。

1. 事件如何注册

A. 在组件上直接绑定事件

<template>
  <RelationGraph
    :options="graphOptions"
    @onReady="onReady"
    @onNodeClick="onNodeClick"
    @onLineClick="onLineClick"
    @onContextmenu="onContextmenu"
  />
</template>

B. Web Components 使用 addEventListener

<relation-graph id="my-graph"></relation-graph>
<script>
  const el = document.getElementById('my-graph');
  el.addEventListener('onNodeClick', (event) => {
    const [node, userEvent] = event.detail;
    console.log(node, userEvent);
  });
</script>

2. 事件分类速查

  • 生命周期:onReadyonViewResizeonForceLayoutFinish
  • 节点/连线点击与展开:onNodeClickonLineClickonNodeExpandonNodeCollapse
  • 拖拽行为:onNodeDragStartonNodeDraggingonNodeDragEndonCanvasDragStartonCanvasDraggingonCanvasDragEnd
  • 画布行为:onCanvasClickonCanvasSelectionEndonContextmenuonFullscreen
  • 缩放与滚动:beforeZoomStartonZoomEndbeforeScrollStart
  • 编辑流程:onResizeStartbeforeNodeResizeonResizeEndonLineVertexDroppedbeforeCreateLineonLineBeCreated
  • 数据进入图谱:beforeAddNodesbeforeAddLines
  • 键盘:onKeyboardDownonKeyboardUp

3. 关键事件与回调签名

onReady

(graphInstance: RelationGraphInstance) => void

用于拿到图实例,后续可调用 setJsonDataaddNodeszoomToFit 等 API。

onNodeClick / onLineClick

(node: RGNode, e: RGUserEvent) => boolean | void | Promise<boolean | void>
(line: RGLine, link: RGLink, e: RGUserEvent) => boolean | void | Promise<boolean | void>

用于节点/连线点击交互。可返回 booleanPromise<boolean> 影响默认后续逻辑。

onContextmenu

(e: RGUserEvent, objectType: 'canvas' | 'node' | 'line', object, eventPositionOnCanvas, eventPositionOnView) => void

用于统一右键菜单入口,可根据 objectType 分支处理画布、节点、连线菜单。

beforeZoomStart / beforeScrollStart

beforeZoomStart: () => void | false
beforeScrollStart: (buffX: number, buffY: number, e: Event) => true | undefined | void
  • beforeZoomStart 返回 false 可阻止缩放。
  • beforeScrollStart 返回 true 可阻止滚动。

beforeCreateLine / onLineBeCreated

beforeCreateLine: (lineInfo) => void | false
onLineBeCreated: (lineInfo) => void

线条创建和改端点时,常用这两个事件做校验与落库。 onLineBeCreated 中如果是“拖拽改线端点”场景,需要通过 graphInstance.addLines(...) 把新线真正加回图中。

4. 常见事件组合示例

let graphInstance: RelationGraphInstance | undefined;

const onReady = (instance: RelationGraphInstance) => {
  graphInstance = instance;
};

const beforeCreateLine = ({ fromNode, toNode }) => {
  if (fromNode.id === toNode.id) return false; // 禁止自环
};

const onLineBeCreated = ({ lineJson }) => {
  if (!graphInstance) return;
  graphInstance.addLines([lineJson]); // 让新线生效
};

5. 与 RGOptions 的关系

部分交互配置会直接影响事件触发体验:

  • wheelEventAction: 鼠标滚轮是缩放、滚动还是禁用
  • dragEventAction: 拖拽是移动画布、框选还是禁用
  • disableNodePointEvent: 是否禁用节点交互事件
  • disableLinePointEvent: 是否禁用连线交互事件

6. 实践建议

  • 先用 onReady 保存实例,再写复杂事件逻辑。
  • 将“可阻止型事件”作为业务规则入口,例如权限校验、连线合法性校验。
  • 大量事件回调中避免重计算,必要时做节流或异步分发。
  • 统一通过 objectType 和事件参数建模菜单行为,避免在多个事件里重复分支。

7. 下一步阅读