使用指南布局

自定义布局

注册坐标计算,处理配置、取消信号和清理,并区分 Graph 执行与独立计算

需要按业务规则安排节点时,可以注册 LayoutExtension。它接收图数据,返回节点坐标。本例把节点等距排成一行。内置算法见布局总览。

实现与执行

execute() 接收本次图数据和运行参数。节点的 ID 和业务数据原样返回,位置用计算出的 x、y。示例从 options.gap 读取间距。

正在加载示例…
先启动 Slow layout,再立即 Cancel + grid;旧结果不会覆盖网格;Layout again 恢复列布局
export function createColumnLayout(): LayoutExtension<ColumnOptions> {
  let context: ExtensionContext | undefined;
  return {
    init(next) { context = next; },
    async execute(data, { width, height, signal, options }) {
      const gap = Number(options.gap ?? 100);
      const nodes = [];
      for (const [index, node] of data.nodes.entries()) {
        await pause(signal, Number(options.delay ?? 0));
        if (signal?.aborted || context?.isDestroyed()) throw new DOMException('Canceled', 'AbortError');
        nodes.push({ ...node, x: width / 2 + (index - (data.nodes.length - 1) / 2) * gap, y: height / 2 });
      }
      return { nodes };
    },
    destroy() { context = undefined; },
  };
}
register('layout', 'docs-column', () => createColumnLayout());

初始的六个节点排成一行。点 Layout again 可以重新计算。点 Slow layout 后再点 Cancel + grid,可以取消计算并切换到网格。

取消与资源

本例等待函数在取消时清理 timer,并在正常结束时移除 abort 监听;循环每步检查 signal / isDestroyed。真实耗时计算也要分块让出主线程,否则点击取消无法被处理。

Graph 在成功、失败或取消后调用 destroy。init 可能未完成,因此清理应支持部分初始化。错误可能被布局回退吸收,不能只凭 await 正常返回判定结果已应用;按钮用自己的代次检查保护状态提示与适配。

Graph 与独立计算

Graph.render / layout / setData 路径执行 init → execute → destroy;独立 runLayout 不调用 init,仍执行 execute / destroy。本例配置只依赖 runtime.options,因此两条路径均可用。

import { runLayout, type GraphData } from '@antv/g6-lite';
export async function calculate(data: GraphData) {
  // 需先注册上述 docs-column;结果只是坐标,不会创建或更新 Graph。
  return runLayout(data, { type: 'docs-column', gap: 100 }, { width: 640, height: 320 });
}

独立计算的结果展示方式见runLayout 示例。Graph 中无需从 execute 调用 requestRender,结果由 Graph 写回;context.data 可能是旧图,不能作为本次布局输入。

常见问题

worker: true 会把自定义布局移到 Worker 吗?

不会自动搬迁注册扩展代码;当前扩展路径优先在主线程。需要自己的 Worker 时管理消息、取消与释放,见Worker 指南。

为什么取消后 Promise 仍正常结束?

取消表示旧结果失效,不承诺抛错。保留业务代次检查,避免旧任务完成后继续更新界面。

完整 runtime 字段、回退和返回类型查LayoutExtension;另一个布局案例见自定义两行布局。

相关可运行示例