流程设计器节点拖拽后位置不更新,如何解决?
用Konva.js做流程设计器时,节点拖拽后坐标没及时更新。我监听了dragend事件,用setPosition手动更新,但节点总偏移原位置。之前尝试过在回调里同步状态到React组件,发现Konva节点坐标和组件状态不一致:
node.on('dragend', () => {
const pos = node.position();
setNodeProps({ x: pos.x, y: pos.y }); // 这里拿到的坐标还是旧值
});
拖拽结束后页面显示位置正常,但保存数据时还是旧坐标,手动console.log发现Konva.Node.attrs.position更新有延迟…
给你一个能跑的代码示例,复制过去试试:
这里关键是用getAbsolutePosition而不是position,前者能拿到最终的正确坐标。还有就是记得调用batchDraw,不然可能会有视图不刷新的问题。
如果你用了Konva的React绑定库,建议在React组件里也保持同样的坐标更新逻辑,双保险。写代码的时候别偷懒,该重绘就重绘,省这一下容易出bug。
实在不行就把Konva的版本固定在7.x,8.x之后的版本改动比较大,坑也多。
node.getClientRect()拿最新位置。改一下你的回调逻辑:node.on('dragend', () => {
const rect = node.getClientRect();
setNodeProps({ x: rect.x, y: rect.y });
});
别折腾attrs.position了,getClientRect最稳。React状态不同步主要是因为Konva内部还没完成渲染,这锅不背。