宏天低代码:可视化流程设计器的前端实现
可视化流程设计器作为低代码平台的核心交互组件,其前端实现直接决定用户操作体验与开发效率。宏天低代码聚焦流程设计的便捷性与流畅度,基于 Canvas 技术 + jsPlumb 库构建高性能可视化引擎,整合拖拽交互、快捷键、Undo/Redo 等核心功能,打造符合企业级需求的流程设计工具。本文将从四大核心维度,拆解宏天低代码可视化流程设计器的前端实现细节,助力开发者快速掌握流程设计器的前端交互技巧。
一、Canvas 绘图引擎:流程可视化的核心基石
Canvas 是宏天低代码流程设计器实现可视化渲染的核心载体,负责流程节点、面板等基础元素的绘制与更新,而节点间的连线则基于jsPlumb库实现(兼容 Canvas 渲染模式),二者结合是保障设计器流畅运行的关键。不同于纯 DOM 渲染,Canvas+jsPlumb 的组合既保留了像素级绘制的高效性,又解决了手动实现连线的复杂度,尤其适合复杂流程的批量节点展示。
宏天低代码采用 Canvas 2D 上下文进行节点绘制,定义统一的节点数据模型(区分开始节点、结束节点、条件节点等),通过ctx.fillRect、ctx.fillText等方法绘制节点样式与文本,同时整合jsPlumb完成连线的自动渲染、拖拽调整;并优化重绘逻辑,仅在节点位置 / 样式变化时局部重绘,避免全量渲染导致的卡顿。核心初始化代码如下:
// Canvas初始化核心代码
const canvas = document.getElementById('flow-canvas');
const ctx = canvas.getContext('2d');
// 设置画布自适应
canvas.width = container.clientWidth;
canvas.height = container.clientHeight;
// jsPlumb初始化(绑定Canvas容器,启用Canvas渲染模式)
const jsPlumbInstance = jsPlumb.getInstance({
container: canvas, // 绑定到Canvas容器
paintStyle: { stroke: '#666', strokeWidth: 2 }, // 连线样式
connector: ['Bezier', { curviness: 50 }], // 贝塞尔曲线连线
anchor: 'AutoDefault' // 自动锚点适配
});
// 节点绘制入口
function renderNode(node) {
ctx.save();
ctx.fillStyle = node.color;
ctx.fillRect(node.x, node.y, node.width, node.height);
// 节点文本绘制
ctx.fillStyle = '#fff';
ctx.fillText(node.label, node.x + 10, node.y + 20);
ctx.restore();
// 为节点注册jsPlumb可连线端点
jsPlumbInstance.addEndpoint(`node-${node.id}`, {
anchor: 'Right', // 右侧端点(出)
position: 'right',
isSource: true
}, {
anchor: 'Left', // 左侧端点(入)
position: 'left',
isTarget: true
});
}
二、拖拽交互设计:提升操作便捷性的核心
拖拽交互是可视化流程设计器最核心的前端交互方式,宏天低代码基于jsPlumb内置的拖拽能力,结合自定义逻辑,兼顾操作流畅度与精准度,实现节点拖拽、连线拖拽、吸附对齐等功能,降低用户操作成本。
jsPlumb原生支持节点拖拽(draggable),只需为节点开启拖拽配置,即可实现自由移动,同时我们扩展了磁吸效果:监听jsPlumb的drag事件,在节点移动时计算与其他节点 / 网格线的距离,当小于阈值时自动对齐,确保流程布局整齐。对于连线拖拽,jsPlumb已封装好 “点击端点拖拽生成连线” 的逻辑,只需监听connection事件完成节点关联校验,即可实现流程逻辑的快速搭建,让前端交互更贴合用户操作习惯。核心拖拽配置代码:
// 开启节点拖拽(基于jsPlumb)
jsPlumbInstance.draggable(`node-${node.id}`, {
containment: canvas, // 限制在Canvas内拖拽
grid: [20, 20], // 网格吸附(可选)
onDrag: (event) => {
// 自定义磁吸逻辑:检测节点与周边元素的距离
const targetNode = checkMagnet(event.target);
if (targetNode) {
jsPlumbInstance.setPosition(event.target, targetNode.x, targetNode.y);
}
}
});
// 监听连线创建事件,完成流程逻辑关联
jsPlumbInstance.on('connection', (conn) => {
const sourceId = conn.sourceId.replace('node-', '');
const targetId = conn.targetId.replace('node-', '');
// 保存连线关系到流程数据模型
flowData.connections.push({ source: sourceId, target: targetId });
});
三、快捷键系统:高效操作的辅助支撑
为提升专业用户的操作效率,宏天低代码流程设计器内置完善的快捷键系统,覆盖节点复制、删除、移动、连线等常用操作,适配 Windows 与 Mac 系统的快捷键差异,避免浏览器默认快捷键冲突。
通过监听keydown事件,判断按键组合实现对应功能,例如 Ctrl+C(复制节点)、Ctrl+V(粘贴节点)、Delete(删除节点 / 连线)、Ctrl+Z(撤销)、Ctrl+Y(重做)等;针对jsPlumb创建的连线,Delete 键可触发jsPlumbInstance.deleteConnection(conn)删除选中连线,同时提供快捷键提示面板,帮助用户快速熟悉操作,进一步优化前端交互体验,让流程设计更高效。
四、Undo/Redo 实现:保障操作安全的关键
流程设计过程中,用户误操作难以避免,Undo/Redo 功能是保障操作安全的核心,宏天低代码采用命令模式实现该功能,结合jsPlumb的 API 特性,确保每一步操作(包括节点增删、连线创建 / 删除)都可追溯、可回退。
将每一次操作封装为命令对象,例如 “创建连线” 命令包含execute(调用jsPlumbInstance.connect)、undo(调用jsPlumbInstance.deleteConnection)方法;“移动节点” 命令包含操作前后的坐标信息。通过两个栈分别存储历史操作与已撤销操作,执行新操作时推入历史栈并清空撤销栈,撤销时弹出历史栈元素并执行undo方法,重做时则弹出撤销栈元素并执行execute方法,兼顾性能与准确性,让用户可放心操作。核心命令示例:
// 连线创建命令
class CreateConnectionCommand {
constructor(jsPlumbInstance, sourceId, targetId) {
this.jsPlumb = jsPlumbInstance;
this.sourceId = sourceId;
this.targetId = targetId;
this.connection = null;
}
// 执行创建连线
execute() {
this.connection = this.jsPlumb.connect({
source: `node-${this.sourceId}`,
target: `node-${this.targetId}`
});
}
// 撤销:删除连线
undo() {
if (this.connection) {
this.jsPlumb.deleteConnection(this.connection);
}
}
}
综上,宏天低代码可视化流程设计器的前端实现,以 Canvas 绘图引擎 + jsPlumb 库为基础,通过流畅的拖拽交互、便捷的快捷键系统与可靠的 Undo/Redo 功能,构建出高效、易用的流程设计工具。后续还将持续优化 Canvas 渲染性能与 jsPlumb 的连线交互细节(如连线样式定制、跨画布连线),进一步提升用户体验,助力企业快速搭建符合需求的业务流程。