配置指南

Combo

节点分组容器的声明、样式、折叠展开和整体拖拽

Combo 是节点的分组容器,用于把一组节点圈在一个可视包围框内。它支持嵌套、折叠 / 展开,以及整体拖拽。

Combo 包围框由 Canvas 2D 在 WebGL 画布下方叠加绘制,不影响节点和边的 GPU 渲染路径。

声明 Combo

const graph = new Graph({
  container: 'container',
  data: {
    nodes: [
      { id: 'n1', comboId: 'frontend' },
      { id: 'n2', comboId: 'frontend' },
      { id: 'n3', comboId: 'backend' },
    ],
    edges: [{ source: 'n1', target: 'n3' }],
    combos: [
      { id: 'frontend', data: { name: 'Frontend' } },
      { id: 'backend', data: { name: 'Backend' } },
    ],
  },
  layout: { type: 'd3-force' },
  behaviors: ['zoom-canvas', 'drag-canvas', 'drag-node', 'click-select'],
});

ComboData

字段说明
idCombo 唯一标识
parentId父 Combo id,用于嵌套
style单个 Combo 的样式覆盖
data业务扩展字段

样式

combo: {
  style: {
    fill: 'rgba(91, 143, 249, 0.08)',
    stroke: 'rgba(91, 143, 249, 0.35)',
    strokeWidth: 1,
    borderRadius: 12,
    padding: 30,
    label: (combo) => (combo.data as Record<string, string>)?.name ?? combo.id,
    labelPlacement: 'top',
  },
}

折叠与展开

graph.collapseCombo('frontend');
graph.expandCombo('frontend');
graph.toggleCombo('frontend');

graph.on('combo:collapse', ({ comboId }) => console.log(comboId));
graph.on('combo:expand', ({ comboId }) => console.log(comboId));

动态调整归属

graph.addToCombo('n4', 'frontend');
graph.removeFromCombo('n4');
graph.createCombo({ id: 'new-group' }, ['n1', 'n2']);
graph.removeCombo('new-group');

查询

graph.getComboData('frontend');
graph.getComboChildren('frontend');
graph.getNodeCombo('n1');

整体拖拽

启用 drag-node 后,拖拽 Combo 区域会带动其子节点一起移动,并触发 combo:dragstart、combo:drag、combo:dragend 事件。