尧图精选

LogicFlow Control 插件完全指南:内置控制面板的注册、定制与源码级原理

🕒 发布时间:2026/9/15 19:54:21 📁 来源:尧图网络
LogicFlow Control 插件完全指南内置控制面板的注册、定制与源码级原理【免费下载链接】LogicFlowA flow chart editing framework focus on business customization. 专注于业务自定义的流程图编辑框架支持实现脑图、ER图、UML、工作流等各种图编辑场景。项目地址: https://gitcode.com/GitHub_Trending/lo/LogicFlow导读Control是 LogicFlow 官方扩展包logicflow/extension中内置的画布控制面板插件注册后会在画布右上角渲染一组工具按钮开箱即用地提供流程图缩小、放大、自适应重置以及上一步/下一步撤销/重做能力。本文以 control.en.md 为主线结合packages/extension与packages/core的真实源码实现完整讲解Control的注册方式、五个内置控制项的底层逻辑、通过addItem/removeItem动态增删自定义控制项的方法以及背后的样式与主题机制帮助你掌握既有默认能力、又能按业务自由扩展的控制面板定制方案。一、快速开始注册 Control 插件Control的注册与 LogicFlow 其他扩展组件完全一致在引入核心包之后通过LogicFlow.use(Control)完成挂载import LogicFlow from logicflow/core; import { Control } from logicflow/extension; import logicflow/extension/es/index.css; LogicFlow.use(Control);两个细节值得注意必须引入扩展样式logicflow/extension/es/index.css中的.lf-control等类名详见 扩展样式定义 与 raw.ts负责控制面板的布局与图标渲染漏掉样式会导致面板无样式或图标缺失。注册后立即生效Control插件在 LogicFlow 实例化时被创建并默认在画布右上角渲染控制面板。该插件属于官方开箱即用类组件无需在LogicFlow构造参数中额外配置。注册之后画布右上角即出现一组悬浮按钮包含缩小、放大、适应画布、上一步、下一步五个默认功能。二、内置控制项一览与源码对应关系官方文档用一个折叠块展示了内置controlItems的结构。对照 control 插件实现内置的五个控制项实际为keyiconClasstitle点击行为调用的核心 APIzoom-outlf-control-zoomOut缩小流程图this.lf.zoom(false)zoom(false)zoom-inlf-control-zoomIn放大流程图this.lf.zoom(true)zoom(true)resetlf-control-fit恢复流程原有尺寸this.lf.resetZoom()resetZoom()undolf-control-undo回到上一步this.lf.undo()undo()redolf-control-redo移到下一步this.lf.redo()redo()每一个控制项都只是图标 文案 回调的声明式描述真正的行为全部委托给 LogicFlow 实例lf上公开的 API因此即使完全不用Control插件你也能通过 LogicFlow 实例 API 手动实现同等能力——这正是官方文档不喜欢 UI 或功能时可以基于 API 自建一说的来源。三、控制项背后核心 API 的源码级解读五个内置按钮对应的四个核心方法都定义在 packages/core/src/LogicFlow.tsx 中zoom(zoomSize?, point?)核心入口为transformModel.zoom(zoomSize, point)。zoomSize支持传入0到n之间的数字小于 1 表示缩小、大于 1 表示放大也支持传入布尔值true/false按内置刻度进行放大/缩小内置按钮正是使用布尔形式第二个可选参数point为缩放原点坐标不传时默认以画布中心为原点。resetZoom()调用transformModel.resetZoom()将图形的缩放比例与位移重置为默认值即适应/恢复原始尺寸。undo()/redo()先通过history.undoAble()/history.redoAble()判断历史栈是否有可回退/可前进的步骤随后取出历史数据并用graphDataToModel重建图数据同时clearSelectElements()清空当前选中态。与缩放相关的两个边界约束方法也值得留意setZoomMiniSize(size)控制缩小的最小倍数默认0.2setZoomMaxSize(size)控制放大的最大倍数默认16它们与Control的缩放按钮协同工作共同决定可缩放范围。四、撤销/重做的禁用态联动机制Control的一个贴心细节是撤销与重做按钮会自动进入/退出禁用态。这并非静态配置而是在渲染阶段动态绑定的。在 getControlTool 渲染逻辑 中可以看到switch (item.key) { case undo: this.lf.on(history:change, ({ data: { undoAble } }: any) { itemContainer.className undoAble ? NORMAL : DISABLED }) break case redo: this.lf.on(history:change, ({ data: { redoAble } }: any) { itemContainer.className redoAble ? NORMAL : DISABLED }) break default: itemContainer.className NORMAL break }也就是说每次历史记录发生变化时插件都会监听history:change事件根据undoAble/redoAble动态切换lf-control-item可用与lf-control-item disabled禁用类名实现无可撤销步骤时按钮置灰的交互效果。禁用态的视觉样式由 raw.ts 中的.lf-control-item.disabled规则提供。五、自定义控制项addItem 动态添加Control通过公开的addItem(item)方法支持向面板中追加任意自定义按钮。官方文档给出了一个非常实用的示例——为控制面板动态添加导航按钮悬停或点击时在对应位置呼出小地图MiniMaplf.extension.control.addItem({ key: mini-map, iconClass: custom-minimap, title: , text: nav, onMouseEnter: (lf, ev) { const position lf.getPointByClient(ev.x, ev.y) lf.extension.miniMap.show( position.domOverlayPosition.x - 120, position.domOverlayPosition.y 35, ) }, onClick: (lf, ev) { const position lf.getPointByClient(ev.x, ev.y) lf.extension.miniMap.show( position.domOverlayPosition.x - 120, position.domOverlayPosition.y 35, ) }, })这个示例中出现了三个值得展开的 APIlf.extension.control与lf.extension.miniMap所有已注册插件实例都会挂载到lf.extension对象上见 LogicFlow.tsx 中 extension 挂载逻辑插件名由各插件的static pluginName决定——Control的pluginName为controlMiniMap的pluginName为miniMap见 mini-map 实现。因此lf.extension.control与lf.extension.miniMap分别指向两个插件的实例。lf.getPointByClient(ev.x, ev.y)将鼠标在浏览器视口client 坐标系中的坐标转换为 LogicFlow 画布内的坐标返回结果中包含domOverlayPosition等字段核心实现见 GraphModel.getPointByClient。示例据此把小地图锚定在鼠标位置附近向左偏移 120、向下偏移 35实现导航跟随效果。miniMap.show(left?, top?)小地图插件的公开显示方法见 mini-map 源码接收相对画布的定位坐标。示例同时绑定了onMouseEnter悬停显示与onClick点击显示两个交互。这里还能看到ControlItem的完整类型定义源码自定义项实际支持五个回调/字段字段类型作用keystring唯一标识removeItem依据它定位iconClassstring图标 CSS 类名配合扩展样式渲染i元素titlestring提示文案渲染为按钮内span的title属性textstring按钮显示的文本hideTextboolean?为true时仅渲染图标不渲染文字默认显示文字见 渲染分支onClick(lf, e) void点击回调参数为lf实例与原生MouseEventonMouseEnter/onMouseLeave(lf, e) void鼠标悬停进出回调同样携带lf与事件对象事件绑定位于 getControlTool插件会把回调以item.onClick.bind(null, this.lf)的形式挂到按钮容器上保证回调第一个参数始终是lf实例。六、移除控制项removeItem 按 key 精确删除与addItem对应Control提供removeItem(key)方法按key精确移除已添加的自定义控制项lf.extension.control.removeItem(mini-map)其底层实现见 源码逻辑是removeItem(key: string) { const index this.controlItems.findIndex((item) item.key key) return index -1 ? null : this.controlItems.splice(index, 1)[0] }即先在controlItems数组中找到第一个key匹配的项并splice移除找不到时返回null。注意removeItem只操作数据数组不会立即触发重渲染——Control的 DOM 是在每次render()如画布重新挂载/插件重新渲染时根据最新的controlItems快照整体重建的getControlTool 中const itemsToRender [...this.controlItems]会拷贝当前数组因此动态增删通常在插件初始化阶段或配合重建流程使用。七、样式与主题控制面板如何适配三种主题模式Control的 UI 原生支持 LogicFlow 的主题模式themeMode。在渲染时插件会读取this.lf.graphModel.themeMode源码并为容器、图标、文本分别拼接主题后缀容器类名lf-control-${themeMode} lf-control如lf-control-dark图标项类名lf-control-item-${themeMode} lf-control-item文本类名lf-control-text-${themeMode} lf-control-text对应的样式规则集中在 raw.ts 与 index.less 中包括.lf-control的固定定位、.lf-control-item的 hover 态、.lf-control-item.disabled的禁用置灰以及五个内置图标类lf-control-zoomOut、lf-control-zoomIn、lf-control-fit、lf-control-undo、lf-control-redo的背景图。这意味着无需改动任何 JS 逻辑仅通过配置不同themeMode即可让控制面板跟随整体主题切换视觉风格自定义图标也只需仿照内置项声明一个iconClass并在自己的 CSS 中为该类设置背景图即可。八、常见使用场景与注意事项综合官方文档与源码实现Control插件在实际业务中的典型用法可归纳为三类零配置默认使用直接LogicFlow.use(Control)获得右上角标准控制面板覆盖缩放与撤销/重做的基础诉求。增强式定制保留内置五项用addItem追加业务按钮如导航小地图、导出、定位到某节点用removeItem剔除不需要的项。完全自建不使用Control直接调用lf.zoom()、lf.resetZoom()、lf.undo()、lf.redo()等实例 API配合自定义 UI 实现完全自主的控制体验。使用中需注意zoom()传布尔值时按内置刻度步进传数字时按比例缩放小于 1 缩小、大于 1 放大并受setZoomMiniSize/setZoomMaxSize边界约束。undo/redo的禁用态由history:change事件驱动只有产生历史记录可撤销操作后按钮才会激活。removeItem只影响数据源若在运行期需要立即生效应结合插件重建或在下一次render()前完成增删。所有自定义回调的第一参数均为lf实例可直接访问lf.getPointByClient、lf.extension.xxx等能力实现跨插件联动。结语Control是一个小而完整的官方插件它用五条声明式配置覆盖了流程图最常用的视图操作又通过addItem/removeItem和基于实例 API 的回调设计为业务定制留下了充分的扩展空间。理解它背后zoom、resetZoom、undo、redo与history:change事件的联动机制不仅能让你熟练定制控制面板更能举一反三掌握整个 LogicFlow 扩展体系注册 → 挂载到lf.extension→ 渲染 DOM → 调用核心 API的标准工作模式。相关源码可在 Control 插件实现、核心实例 API、扩展样式 中继续深入阅读。【免费下载链接】LogicFlowA flow chart editing framework focus on business customization. 专注于业务自定义的流程图编辑框架支持实现脑图、ER图、UML、工作流等各种图编辑场景。项目地址: https://gitcode.com/GitHub_Trending/lo/LogicFlow创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联 返回资讯列表 →