LogicFlow 流程图编辑框架:从入门到进阶的技术实践

cursor\claule skill
感谢 Stars

一、为什么需要 LogicFlow?

在低代码、工作流、可视化编排等场景中,流程图编辑器是核心能力之一。无论是审批流程、业务编排、脑图、ER 图还是 UML 图,都需要一套可扩展、易集成的图编辑方案。LogicFlow 是滴滴开源的流程图编辑框架,基于 TypeScript 构建,支持 Vue 2/3、React 16+,用 JSON 数据驱动视图,适合快速搭建各类图编辑应用。

本文基于 LogicFlow 官方能力与常见实践,梳理从安装、核心概念、自定义节点与边、插件系统到 Vue/React 集成与 BPMN 工作流的一条龙技术路径,目标读者是需要在项目里落地流程图编辑器的前端开发者。

二、安装与快速开始

通过 npm / yarn / pnpm 安装核心库与扩展库:

npm install @logicflow/core @logicflow/extension --save

页面中准备一个固定宽高的容器,并引入样式:

<div id="container"></div>
#container { width: 100%; height: 500px; }

初始化实例并渲染简单图数据:

import LogicFlow from '@logicflow/core'
import '@logicflow/core/dist/style/index.css'

const lf = new LogicFlow({
  container: document.querySelector('#container'),
  grid: true,
})

lf.render({
  nodes: [
    { id: '1', type: 'rect', x: 100, y: 100, text: '节点1' },
    { id: '2', type: 'circle', x: 300, y: 100, text: '节点2' },
  ],
  edges: [
    { sourceNodeId: '1', targetNodeId: '2', type: 'polyline' }
  ]
})

即可得到一个可拖拽、可连线的流程图画布。图的数据结构是标准的 nodes + edges,便于与后端接口、本地存储对接。

三、核心概念:数据与内置图形

LogicFlow 使用 JSON 描述整张图。节点(NodeConfig)包含 idtypexy,以及可选的 textproperties;边(EdgeConfig)包含 sourceNodeIdtargetNodeIdtype 等。type 决定渲染成哪种图形。

内置节点类型包括:rect(矩形)、circle(圆形)、diamond(菱形)、polygon(多边形)、ellipse(椭圆),对应不同的 NodeModel/Node 基类。内置边类型包括:line(直线)、polyline(折线,默认)、bezier(贝塞尔曲线)。这些足以支撑简单流程图;复杂业务则依赖自定义节点与边。

四、自定义节点:MVVM 与 Model/View

LogicFlow 采用 MVVM:数据与行为在 Model,渲染在 View。自定义节点需要提供 typemodelview(view 可复用内置如 RectNode)。

在 Model 中通常重写:

  • initNodeData(data):设置宽高、默认属性;
  • getNodeStyle():返回填充、描边、圆角等样式;
  • getTextStyle():文本样式;
  • getDefaultAnchor():锚点位置,用于连线的起点/终点;
  • getConnectedSourceRules() / getConnectedTargetRules():连接规则,用于限制“谁可以连谁”。

示例:定义一个固定尺寸、带样式的“自定义节点”:

class CustomNodeModel extends RectNodeModel {
  initNodeData(data) {
    super.initNodeData(data)
    this.width = 120
    this.height = 60
  }
  getNodeStyle() {
    const style = super.getNodeStyle()
    style.fill = '#e8f4ff'
    style.stroke = '#1890ff'
    return style
  }
}

再用 lf.register({ type: 'custom-node', view: RectNode, model: CustomNodeModel }) 注册,即可在 nodes 里使用 type: 'custom-node'

更复杂的节点(如带状态、图标、多行文案)可以在 Model 的 setAttributes()getNodeStyle() 中根据 properties 分支样式,或在 View 中重写 getShape() 使用 LogicFlow 的 h() 渲染多元素。HTML 节点则可继承 HtmlNode / HtmlNodeModel,在 setHtml(rootEl) 里挂载 Vue/React 组件,实现完全自定义的 DOM 内容。

五、事件与常用 API

通过 lf.on(eventName, callback) 监听节点、边、画布等事件。常用事件包括:node:clicknode:dblclicknode:addnode:deletenode:dragstartnode:dropedge:clickedge:addedge:deleteblank:clickselection:selectedhistory:change 等。回调中可拿到 dataeposition,便于做属性面板、右键菜单、拖拽结束后的业务校验。

常用 API 包括:lf.getGraphData() / lf.render(graphData) 读写整图;lf.addNode() / lf.deleteNode() / lf.addEdge() / lf.deleteEdge() 增删节点与边;lf.getSelectElements() 获取当前选中;lf.setProperties(id, props) 更新属性;lf.zoom() / lf.resetZoom() / lf.translateCenter() / lf.fitView() 控制视图;lf.undo() / lf.redo() 历史记录(需在初始化时开启 history: true)。配合事件与 API,可以轻松实现保存、加载、导出、撤销重做、属性编辑等能力。

六、插件系统:控制栏、小地图、导出、拖拽面板

LogicFlow 的扩展能力通过插件注入。从 @logicflow/extension 引入样式后,在 new LogicFlow({ plugins: [...] }) 中注册即可。

常用插件包括:Control(缩放、重置、撤销、重做等控制按钮)、Menu(节点/边/画布右键菜单)、DndPanel(从面板拖拽节点到画布)、MiniMap(小地图)、Snapshot(导出图片)、SelectionSelect(框选)、BpmnElement(BPMN 节点与边)、NodeResize(节点缩放)、DynamicGroup(分组)等。

例如启用 Control、MiniMap、Snapshot:

import { Control, MiniMap, Snapshot } from '@logicflow/extension'
import '@logicflow/extension/lib/style/index.css'

const lf = new LogicFlow({
  container: document.querySelector('#container'),
  plugins: [Control, MiniMap, Snapshot]
})

DndPanel 可通过 lf.extension.dndPanel.setPatternItems([...]) 配置可拖拽的节点类型(含 typetextlabelicon 等),Menu 通过 lf.extension.menu.setMenuConfig({ nodeMenu, edgeMenu, graphMenu }) 配置右键项与回调。这样无需从零实现工具栏和侧边栏,即可得到一个功能完整的流程图编辑器壳子。

七、Vue3 / React 集成要点

在 Vue3 中,一般在 onMounted 里根据 ref 容器创建 LogicFlow 实例,在 onUnmounted 里做清理(如置空实例、按需销毁)。在 React 中,在 useEffect 里创建实例并 return 清理函数。注意单页应用路由切换时务必销毁实例,避免重复挂载和内存泄漏。

lf.getGraphData() 与后端接口或本地状态同步即可实现保存与加载;选中状态可用 lf.on('node:click', ...) 更新到组件的 ref/state,驱动属性面板展示与编辑。若使用 DndPanel,也可在 Vue/React 中自建节点列表,通过 lf.dnd.startDrag({ type, text }) 在拖拽开始时交给 LogicFlow 处理,实现与现有 UI 库一致的交互。

八、进阶:自定义边、连接规则与 BPMN

自定义边时,继承 PolylineEdgeModel(或 BezierEdgeModel 等),重写 getEdgeStyle()getEdgeAnimationStyle() 即可改变线条样式与动画(如虚线流动)。连接规则在节点的 Model 中通过 getConnectedSourceRules() / getConnectedTargetRules() 返回校验数组,每条规则包含 messagevalidate(source, target),返回 false 时连接被禁止并可选提示 message。例如开始节点只允许作为源、结束节点只允许作为目标、某类节点限制连出数量等,都可在此实现。

BPMN 工作流场景可使用官方提供的 BpmnElementBpmnXmlAdapter。BpmnElement 会注册如 bpmn:startEventbpmn:endEventbpmn:userTaskbpmn:serviceTaskbpmn:exclusiveGatewaybpmn:parallelGatewaybpmn:sequenceFlow 等类型;BpmnXmlAdapter 提供 lf.adapterOut(data) 导出为 BPMN XML、lf.adapterIn(xml) 从 XML 导入为图数据,便于与流程引擎或第三方 BPMN 工具对接。

九、初始化配置与主题

new LogicFlow({ ... }) 时常用配置包括:gridbackgroundkeyboard: { enabled: true }(快捷键)、history: truesnapline: true(对齐线)、edgeType(默认边类型)、adjustEdgeadjustNodePositionhideAnchors 等。静默模式(只读展示)可通过 isSilentModestopScrollGraphstopMoveGraphstopZoomGraph 等关闭交互。主题通过 style 传入,可统一配置 rectcirclepolylineanchorarrowsnapline 等样式,便于与产品视觉规范一致。

十、实践建议

在实际项目中落地 LogicFlow 时,建议优先做三件事:一是用 lf.getGraphData() 做自动保存或定时同步,避免用户误关页导致数据丢失;二是为节点和边预留 properties 字段,把业务字段(如审批人、超时时间、表单 ID)存进去,便于与后端流程定义一致;三是利用 keyboard: { enabled: true } 和默认的 Ctrl+Z/Y、Delete 等快捷键,减少重复开发。若需要只读展示(如流程进度图),开启 isSilentMode: true 即可禁用拖拽与连线。自定义节点较多时,可统一放在单独目录、按业务模块注册,并配合 DndPanel 分组展示,便于维护与迭代。

十一、小结

LogicFlow 通过“图数据 + 内置图形 + 自定义 Model/View + 插件”的组合,覆盖了从简单流程图到工作流、BPMN 的常见需求。掌握其数据结构、事件与 API、自定义节点与边的扩展方式,以及插件与 Vue/React 的集成方式,即可在业务中快速落地可维护、可扩展的流程图编辑器。更多 API、主题和高级用法可参考官方文档(https://site.logic-flow.cn/)与 GitHub(https://github.com/didi/LogicFlow)。

Logo

小龙虾开发者社区是 CSDN 旗下专注 OpenClaw 生态的官方阵地,聚焦技能开发、插件实践与部署教程,为开发者提供可直接落地的方案、工具与交流平台,助力高效构建与落地 AI 应用

更多推荐