news 2026/9/15 13:53:09

LogicFlow 编辑配置完全指南:updateEditConfig 与 getEditConfig 实例 API 深度解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LogicFlow 编辑配置完全指南:updateEditConfig 与 getEditConfig 实例 API 深度解析

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 实例提供了两个与编辑配置直接相关的方法,它们是控制画布交互行为的统一入口:

方法签名作用
updateEditConfigupdateEditConfig(config: Partial<IEditConfigType>): void将传入的配置片段部分合并到当前生效的编辑配置中
getEditConfiggetEditConfig(): 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 画布相关

字段类型默认值说明
isSilentModebooleanfalse静默模式(只读模式),开启后节点/边不可移动、文本不可编辑、锚点隐藏
stopZoomGraphbooleanfalse禁止缩放画布
stopScrollGraphbooleanfalse禁止鼠标滚轮平移画布
stopMoveGraphboolean \| 'vertical' \| 'horizontal' \| [number, number, number, number]false禁止/约束拖动画布。true完全禁止;'vertical'禁止垂直拖动;'horizontal'禁止水平拖动;[minX, minY, maxX, maxY]限定画布可拖动范围
snapGridbooleanfalse开启网格对齐
isPinchingbooleanfalse是否为双指捏合状态(内部使用,标识捏合时暂停框选等交互)

3.2 节点相关

字段类型默认值说明
adjustNodePositionbooleantrue允许拖动节点
hideAnchorsbooleanfalse隐藏节点所有锚点
allowRotatebooleanfalse允许节点旋转(旋转控制点的显隐)
allowResizebooleanfalse允许节点缩放(缩放调整点的显隐)
autoExpandbooleanfalse元素超出画布边界时是否自动扩展画布
hoverOutlinebooleantrue节点悬浮时是否显示外框
nodeSelectedOutlinebooleantrue节点被选中时是否显示 outline

3.3 边相关

字段类型默认值说明
adjustEdgebooleantrue允许调整边
adjustEdgeMiddlebooleanfalse允许调整边的中间点
adjustEdgeStartAndEndbooleanfalse允许调整边起点和终点(总开关)
adjustEdgeStartbooleanfalse允许调整边起点
adjustEdgeEndbooleanfalse允许调整边终点
edgeSelectedOutlinebooleantrue边被选中时是否显示 outline

注意:源码中adjustEdgeStart/adjustEdgeEnd通常由adjustEdgeStartAndEnd联动设置(见 computeConfig),传入布尔值时会同步覆盖首尾两端。

3.4 文本相关

字段类型默认值说明
textEditbooleantrue允许文本编辑(全局)
nodeTextEditbooleantrue允许节点文本编辑
edgeTextEditbooleantrue允许边文本编辑
textDraggablebooleanfalse允许文本拖拽(全局,含 Text 与 Label)
nodeTextDraggablebooleanfalse允许节点文本拖拽
edgeTextDraggablebooleanfalse允许边文本拖拽

3.5 文本模式与多选(2.0.0 新增)

字段类型默认值说明
multipleSelectKeystring''多选按键,支持meta(Cmd)、shiftalt不支持ctrl,因为 ctrl 会触发 contextmenu
textModeTextMode'text'全局文本模式
nodeTextModeTextMode'text'节点文本模式
edgeTextModeTextMode'text'边文本模式
nodeTextMultiplebooleanfalse是否支持多节点文本
edgeTextMultiplebooleanfalse是否支持多边文本
nodeTextVerticalbooleanfalse节点文本是否垂直展示
edgeTextVerticalbooleanfalse边文本是否垂直展示

TextMode枚举定义在 constant/index.ts,取值为'text''label',即元素文本类型可为普通 Text 或启用 Label 能力。

四、源码级原理:合并、静默模式与联动

4.1 computeConfig 的"衍生合并"

updateEditConfig的核心并不只是简单赋值,而是经过 computeConfig 的处理,它包含几条值得注意的联动规则:

  1. 全局文本开关联动:传入textEdit时,会同时覆盖nodeTextEditedgeTextEdit(源码);
  2. 全局文本拖拽联动:传入textDraggable时,会同时覆盖nodeTextDraggableedgeTextDraggable(源码);
  3. 全局文本模式联动:传入textMode时,会同时覆盖nodeTextModeedgeTextMode(源码);
  4. 边端点开关联动:传入布尔类型的adjustEdgeStartAndEnd时,会同时覆盖adjustEdgeStartadjustEdgeEnd(源码)。

这也解释了为什么getEditConfig()拿到的字段可能比你传入的更"丰富"——全局开关与细分开关始终被同步为一致状态。

4.2 静默模式(isSilentMode)的暂存与恢复

computeConfig中有一套配置暂存机制(对应 silentModeConfig):

  • isSilentModefalse变为true时,先用pick(this, allKeys)暂存当前全部配置到stagedConfig,再套用静默模式配置:
    • 允许画布缩放/滚动/拖动(stopZoomGraphstopScrollGraphstopMoveGraph均为false);
    • 禁止调整边、禁止拖动节点、隐藏锚点、禁止旋转与缩放(adjustEdgeadjustNodePositionhideAnchorsallowRotateallowResize等);
    • 禁止一切文本编辑与拖拽。
  • 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 中还会做三件额外的事:

  1. 平移范围:当传入stopMoveGraph时,调用transformModel.updateTranslateLimits(config.stopMoveGraph)同步更新画布平移限制;
  2. 网格对齐:当snapGrid发生变化时,调用graphModel.updateGridSize在网格尺寸与实际尺寸间切换(源码);
  3. 事件广播:每次更新后派发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, });

注意adjustEdgeStartAndEndadjustEdgeMiddle是折线编辑的独立开关,配合multipleSelectKey: 'shift'(不支持ctrl)可实现多选后批量操作。

5.5 初始化与运行时配置的对应关系

编辑配置既可以在实例创建时通过构造选项设置(如isSilentModestopZoomGraphstopMoveGraphtextEditallowRotateallowResize等,见 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: truesnapline: true);
  • 事件枚举:constant/index.ts——editConfig:changed事件定义。

总结

lf.updateEditConfiglf.getEditConfig是 LogicFlow 控制画布交互能力的统一入口:前者支持按字段部分合并,并自动处理全局开关的联动、静默模式的暂存恢复、平移/网格/快捷键的同步以及editConfig:changed事件广播;后者返回完整配置快照,便于排查与状态同步。结合本文的配置表格与实战组合,你可以为不同用户角色快速构建差异化的编辑体验。

【免费下载链接】LogicFlowA flow chart editing framework focus on business customization. 专注于业务自定义的流程图编辑框架,支持实现脑图、ER图、UML、工作流等各种图编辑场景。项目地址: https://gitcode.com/GitHub_Trending/lo/LogicFlow

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/15 13:52:33

随机断网不用慌:DHCP地址池冲突排查实战

最近被朋友拉去处理一个挺典型的网络故障&#xff1a;公司里“随机终端断网”&#xff0c;断一下又自己恢复&#xff0c;客户自己查了好几天没头绪。我过去看了不到半天就定位到了根因&#xff0c;说穿了其实特别简单——不是硬件坏了&#xff0c;也不是被攻击&#xff0c;就是…

作者头像 李华
网站建设 2026/9/15 13:48:10

开源AI风险披露实战:免责声明、模型卡与合规落地清单

“我的模型被一个人 fork 走了&#xff0c;第二天他接进了公司客服系统&#xff0c;机器人说错话&#xff0c;客户索赔&#xff0c;现在对方律师函发到我的开源项目邮箱里。我该怎么披露风险、怎么自保&#xff1f;”这是我上个月在一个开源社群里看到的真实求助帖。回帖里最高…

作者头像 李华