LogicFlow 编辑配置完全指南:updateEditConfig 与 getEditConfig 实例 API 深度解析
【免费下载链接】LogicFlowA flow chart editing framework focus on business customization. 专注于业务自定义的流程图编辑框架,支持实现脑图、ER图、UML、工作流等各种图编辑场景。项目地址: https://gitcode.com/GitHub_Trending/lo/LogicFlow
导读
本文围绕 LogicFlow 实例的编辑配置(Edit Configuration)读写 API 展开,聚焦 updateEditConfig 与 getEditConfig 两个核心方法,并结合底层 EditConfigModel 的源码实现,逐一讲解画布、节点、边、文本等全部编辑控制项。读完本文,你将掌握如何通过配置动态控制画布的缩放、平移、静默模式、节点/边的调整能力、文本编辑与拖拽、多选按键等行为,以及如何组合运用这些配置打造不同角色的编辑体验(浏览者、编辑者、演示者)。
一、编辑配置 API 概览
LogicFlow 实例提供了两个与编辑配置直接相关的方法,它们是控制画布交互行为的统一入口:
| 方法 | 签名 | 作用 |
|---|---|---|
updateEditConfig | updateEditConfig(config: Partial<IEditConfigType>): void | 将传入的配置片段部分合并到当前生效的编辑配置中 |
getEditConfig | getEditConfig(): IEditConfigType | 返回当前实例完整生效的编辑配置 |
两者的类型统一由IEditConfigType约束,该类型定义于 EditConfigModel.ts 源码中,文档化的字段表格见 IEditConfigType(编辑控制配置)。
在实例层面,这两个方法是对graphModel.editConfigModel的薄封装:
lf.updateEditConfig(config)内部调用editConfigModel.updateEditConfig(config),随后根据配置变化联动处理平移范围限制、快捷键启用状态、网格对齐状态,并派发editConfig:changed事件;lf.getEditConfig()内部调用editConfigModel.getConfig(),返回当前所有配置键的完整快照。
二、基础用法:读取与更新
2.1 更新编辑配置
updateEditConfig接收Partial<IEditConfigType>,即只传需要变更的字段,其余字段保持现状。这是该方法与"整体覆盖"最大的区别——适合在运行期根据用户角色、页面状态动态切换能力。
// 禁止画布缩放,其余配置不变 lf.updateEditConfig({ stopZoomGraph: true, });多个字段可以一次合并提交:
lf.updateEditConfig({ adjustNodePosition: false, hideAnchors: true, adjustEdge: false, });从源码看,该合并逻辑位于 EditConfigModel.computeConfig:它会对配置做一系列"衍生合并"(详见第四节),再通过assign合并到模型上,并以 mobx@action包裹保证响应式更新。
2.2 获取当前编辑配置
const config = lf.getEditConfig(); console.log(config.isSilentMode, config.adjustNodePosition, config.snapGrid);返回的是pick(this, allKeys)的完整字段快照(见 getConfig 实现),包含IEditConfigType定义的全部键,便于排查当前交互能力。
三、配置项全解析(IEditConfigType)
IEditConfigType的全部字段可归纳为五组,下表为每个字段的类型、默认值与含义(默认值来源于 EditConfigModel 的类属性初始化):
3.1 画布相关
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
isSilentMode | boolean | false | 静默模式(只读模式),开启后节点/边不可移动、文本不可编辑、锚点隐藏 |
stopZoomGraph | boolean | false | 禁止缩放画布 |
stopScrollGraph | boolean | false | 禁止鼠标滚轮平移画布 |
stopMoveGraph | boolean \| 'vertical' \| 'horizontal' \| [number, number, number, number] | false | 禁止/约束拖动画布。true完全禁止;'vertical'禁止垂直拖动;'horizontal'禁止水平拖动;[minX, minY, maxX, maxY]限定画布可拖动范围 |
snapGrid | boolean | false | 开启网格对齐 |
isPinching | boolean | false | 是否为双指捏合状态(内部使用,标识捏合时暂停框选等交互) |
3.2 节点相关
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
adjustNodePosition | boolean | true | 允许拖动节点 |
hideAnchors | boolean | false | 隐藏节点所有锚点 |
allowRotate | boolean | false | 允许节点旋转(旋转控制点的显隐) |
allowResize | boolean | false | 允许节点缩放(缩放调整点的显隐) |
autoExpand | boolean | false | 元素超出画布边界时是否自动扩展画布 |
hoverOutline | boolean | true | 节点悬浮时是否显示外框 |
nodeSelectedOutline | boolean | true | 节点被选中时是否显示 outline |
3.3 边相关
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
adjustEdge | boolean | true | 允许调整边 |
adjustEdgeMiddle | boolean | false | 允许调整边的中间点 |
adjustEdgeStartAndEnd | boolean | false | 允许调整边起点和终点(总开关) |
adjustEdgeStart | boolean | false | 允许调整边起点 |
adjustEdgeEnd | boolean | false | 允许调整边终点 |
edgeSelectedOutline | boolean | true | 边被选中时是否显示 outline |
注意:源码中
adjustEdgeStart/adjustEdgeEnd通常由adjustEdgeStartAndEnd联动设置(见 computeConfig),传入布尔值时会同步覆盖首尾两端。
3.4 文本相关
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
textEdit | boolean | true | 允许文本编辑(全局) |
nodeTextEdit | boolean | true | 允许节点文本编辑 |
edgeTextEdit | boolean | true | 允许边文本编辑 |
textDraggable | boolean | false | 允许文本拖拽(全局,含 Text 与 Label) |
nodeTextDraggable | boolean | false | 允许节点文本拖拽 |
edgeTextDraggable | boolean | false | 允许边文本拖拽 |
3.5 文本模式与多选(2.0.0 新增)
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
multipleSelectKey | string | '' | 多选按键,支持meta(Cmd)、shift、alt。不支持ctrl,因为 ctrl 会触发 contextmenu |
textMode | TextMode | 'text' | 全局文本模式 |
nodeTextMode | TextMode | 'text' | 节点文本模式 |
edgeTextMode | TextMode | 'text' | 边文本模式 |
nodeTextMultiple | boolean | false | 是否支持多节点文本 |
edgeTextMultiple | boolean | false | 是否支持多边文本 |
nodeTextVertical | boolean | false | 节点文本是否垂直展示 |
edgeTextVertical | boolean | false | 边文本是否垂直展示 |
TextMode枚举定义在 constant/index.ts,取值为'text'与'label',即元素文本类型可为普通 Text 或启用 Label 能力。
四、源码级原理:合并、静默模式与联动
4.1 computeConfig 的"衍生合并"
updateEditConfig的核心并不只是简单赋值,而是经过 computeConfig 的处理,它包含几条值得注意的联动规则:
- 全局文本开关联动:传入
textEdit时,会同时覆盖nodeTextEdit与edgeTextEdit(源码); - 全局文本拖拽联动:传入
textDraggable时,会同时覆盖nodeTextDraggable与edgeTextDraggable(源码); - 全局文本模式联动:传入
textMode时,会同时覆盖nodeTextMode与edgeTextMode(源码); - 边端点开关联动:传入布尔类型的
adjustEdgeStartAndEnd时,会同时覆盖adjustEdgeStart与adjustEdgeEnd(源码)。
这也解释了为什么getEditConfig()拿到的字段可能比你传入的更"丰富"——全局开关与细分开关始终被同步为一致状态。
4.2 静默模式(isSilentMode)的暂存与恢复
computeConfig中有一套配置暂存机制(对应 silentModeConfig):
- 当
isSilentMode从false变为true时,先用pick(this, allKeys)暂存当前全部配置到stagedConfig,再套用静默模式配置:- 允许画布缩放/滚动/拖动(
stopZoomGraph、stopScrollGraph、stopMoveGraph均为false); - 禁止调整边、禁止拖动节点、隐藏锚点、禁止旋转与缩放(
adjustEdge、adjustNodePosition、hideAnchors、allowRotate、allowResize等); - 禁止一切文本编辑与拖拽。
- 允许画布缩放/滚动/拖动(
- 当
isSilentMode重新变为false时,会从stagedConfig恢复进入静默模式前的全部配置(源码)。
实现上还有一个细节:通过config.isSilentMode !== this.isSilentMode阻止了对true的重复赋值,避免多次调用导致暂存配置被污染(对应 issue #1180 的修复,见 源码注释)。
在实例层面,静默模式切换还会联动快捷键状态:LogicFlow.tsx 中,进入静默模式时调用this.keyboard.disable(),退出时调用this.keyboard.enable(true)。
4.3 实例层的额外联动
除了editConfigModel本身,lf.updateEditConfig在 LogicFlow.tsx 中还会做三件额外的事:
- 平移范围:当传入
stopMoveGraph时,调用transformModel.updateTranslateLimits(config.stopMoveGraph)同步更新画布平移限制; - 网格对齐:当
snapGrid发生变化时,调用graphModel.updateGridSize在网格尺寸与实际尺寸间切换(源码); - 事件广播:每次更新后派发
editConfig:changed事件(EventType.EDIT_CONFIG_CHANGED,见 constant/index.ts),载荷为editConfigModel.getConfig()的最新完整配置。
// 监听编辑配置变化,可用于联动外部 UI 状态 lf.on('editConfig:changed', ({ data }) => { console.log('编辑配置已更新', data); });4.4 editConfigModel 运行时访问
getEditConfig/updateEditConfig只是实例快捷方法,运行时也可以通过lf.graphModel.editConfigModel直接访问模型,字段含义与IEditConfigType完全一致(见 graphModel → editConfigModel)。该模型是 GraphModel 上被 mobx 观测的属性,配置变更会直接驱动相关交互视图的响应式更新(GraphModel.ts 初始化)。
五、实战组合:典型交互场景配置
5.1 只读展示(浏览者视角)
lf.updateEditConfig({ isSilentMode: true, });一行即完成"只读化":节点、边不可移动编辑,锚点隐藏,快捷键被禁用。退出时传false即可完整恢复。
5.2 画布固定 + 节点可拖动(演示者视角)
lf.updateEditConfig({ stopZoomGraph: true, stopScrollGraph: true, stopMoveGraph: true, hideAnchors: true, adjustEdge: false, adjustEdgeStartAndEnd: false, });保留adjustNodePosition: true,观众可以拖动节点梳理流程,但不会误缩放、误改连线。
5.3 仅允许选中与查看
lf.updateEditConfig({ adjustNodePosition: false, adjustEdge: false, textEdit: false, hideAnchors: true, });关闭所有可编辑能力,但保留选中 outline(nodeSelectedOutline/edgeSelectedOutline默认即为true),适合审批/预览场景。
5.4 精细编辑(开发者视角)
lf.updateEditConfig({ adjustEdge: true, adjustEdgeMiddle: true, adjustEdgeStartAndEnd: true, adjustNodePosition: true, textEdit: true, textDraggable: true, allowRotate: true, allowResize: true, multipleSelectKey: 'shift', snapGrid: true, });注意adjustEdgeStartAndEnd与adjustEdgeMiddle是折线编辑的独立开关,配合multipleSelectKey: 'shift'(不支持ctrl)可实现多选后批量操作。
5.5 初始化与运行时配置的对应关系
编辑配置既可以在实例创建时通过构造选项设置(如isSilentMode、stopZoomGraph、stopMoveGraph、textEdit、allowRotate、allowResize等,见 Options.Common 类型定义),也可以在运行期用updateEditConfig动态调整。两者最终都会汇聚到同一个EditConfigModel(构造时通过new EditConfigModel(options)初始化,见 GraphModel.ts),因此运行期的更新会无缝叠加在初始化配置之上。
// 初始化时即进入只读模式 const lf = new LogicFlow({ container: document.querySelector('#container'), isSilentMode: true, }); // 运行期局部放开:允许查看锚点,但仍不可移动 lf.updateEditConfig({ hideAnchors: false });六、与编辑配置相关的源码阅读路线
若想深入验证本文所述行为,可按以下路径继续阅读:
- 实例 API 封装:LogicFlow.tsx——
updateEditConfig/getEditConfig的完整实现与事件广播; - 配置模型与默认值:EditConfigModel.ts——
IEditConfigType字段定义、全部默认值、静默模式暂存与computeConfig合并逻辑; - 类型字典:MainTypes.en.md——
IEditConfigType的文档化字段表格; - 运行时模型:graphModel.en.md——
editConfigModel的方法与使用说明; - 构造选项:options.ts——初始化时可用的编辑相关配置项及默认值(如
textEdit: true、snapline: true); - 事件枚举:constant/index.ts——
editConfig:changed事件定义。
总结
lf.updateEditConfig与lf.getEditConfig是 LogicFlow 控制画布交互能力的统一入口:前者支持按字段部分合并,并自动处理全局开关的联动、静默模式的暂存恢复、平移/网格/快捷键的同步以及editConfig:changed事件广播;后者返回完整配置快照,便于排查与状态同步。结合本文的配置表格与实战组合,你可以为不同用户角色快速构建差异化的编辑体验。
【免费下载链接】LogicFlowA flow chart editing framework focus on business customization. 专注于业务自定义的流程图编辑框架,支持实现脑图、ER图、UML、工作流等各种图编辑场景。项目地址: https://gitcode.com/GitHub_Trending/lo/LogicFlow
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考