使用指南插件

自定义插件

实现、注册并使用一个点击计数器插件

下面实现一个点击计数器。它在图容器里显示面板,点击节点或面板上的按钮时更新计数。

实现插件

用工厂函数创建插件。计数、面板和退订函数都保存在工厂函数内部,每个插件实例独立管理自己的状态。

方法在示例中的作用
init(context, options)读取标题等插件参数。
mount(container)在图容器里创建面板,订阅节点点击。
destroy()退订节点点击,移除面板。插件自己创建的定时器等资源也在这里清理。

注册与使用

用 register('plugin', 'docs-counter', createCounter) 注册工厂,再在 plugins 中配置 { type: 'docs-counter', caption: 'Clicks' }。完整的图配置见插件总览。

代码示例

点击节点或 Plugin +1,计数会加一。点击 Render again 后,计数归零;再次点击节点,计数仍然只加一。

正在加载示例…
按钮或节点点击加一;Render again 重挂载并归零,重复后一次节点点击仍只加一
export function createCounter(): PluginExtension<CounterOptions> {
  let ui: ReturnType<typeof createDemoPanel> | undefined;
  let unsubscribe: (() => void) | undefined;
  let settings: CounterOptions | undefined;
  let count = 0;
  const report = () => ui?.setStatus(`${settings?.caption ?? 'Clicks'}: ${count}`);
  const increment = () => { count++; report(); };
  return {
    init(_context, options) { settings = options; },
    mount(container) {
      ui = createDemoPanel(container);
      ui.addAction('Plugin +1', increment);
      if (settings?.onRenderAgain) ui.addAction('Render again', settings.onRenderAgain);
      report();
      unsubscribe = settings?.subscribe?.(increment);
    },
    destroy() {
      unsubscribe?.(); unsubscribe = undefined;
      ui?.destroy();
      ui = undefined;
      settings = undefined;
    },
  };
}
register('plugin', NAME, () => createCounter());

展开「完整代码」可查看节点点击的接入方式:应用通过 subscribe 传入订阅函数,在里面调用 graph.on(),并返回调用 graph.off() 的退订函数。如果重挂载后一次点击加了多次,检查 destroy() 是否执行了退订。

更多钩子见 PluginExtension。