reactflow整理节点,尾节点位置的大坑

搞了好久终于搞出来了,问题是有个别尾节点位置会拉的非常远,如图

只测1个节点的尾节点都有距离,如图

我又搞了个普通节点做对比,也有问题

我就不会了,以为是dagre的事儿, 换了elk还是有问题,各种大模型找原因,都不行

我就一个节点一个节点的坐标全都打出来,把整理前和整理后的节点都打出来,发现尾节点的x坐标和普通尾节点的x坐标一致,我都懵了

最后捅咕出来的成功代码

复制代码
Zhenglijiedian = (): void => {
    const originNodes = this.flowInstance?.getNodes()
    const edges = this.flowInstance?.getEdges()

    //过滤出width不为空的节点
    var parentNode = []
    const nodes = originNodes.filter(node => {
      if(node.parentId){
        parentNode.push(node.parentId);
      }
      return node.width !== undefined && node.width !== null && node.width > 0;
    });
    console.log("nodes:", nodes)

    const dagreGraph = new dagre.graphlib.Graph();
    dagreGraph.setDefaultEdgeLabel(() => ({}));
    dagreGraph.setGraph({
      rankdir: 'LR', // 布局方向,可以是 'TB'(上到下)、'LR'(左到右)、'BT'(下到上)、'RL'(右到左)
      align: 'UL',   // 对齐方式
      nodesep: 40,  // 节点之间的水平距离
      ranksep: 60,  // 节点之间的垂直距离
      ranker: 'network-simplex', // 节点排序方式
      marginx: 60,  // 左边距
      marginy: 200 // 上边距
    });
    const parentNodeLayoutMap = {} as Record<string, Node>
    nodes.forEach(node => {
      dagreGraph.setNode(node.id, { width: node.width, height: node.height });
      if(parentNode.includes(node.id)){
        parentNodeLayoutMap[node.id] = node;
      }
    });
    edges.forEach(edge => {
      dagreGraph.setEdge(edge.source, edge.target);
    });
    dagre.layout(dagreGraph);

    nodes.map(node => {
      const position = dagreGraph.node(node.id);
      node.position.x = position.x - node.width / 2
      node.position.y = position.y - node.height / 2
      if (node.parentId && parentNodeLayoutMap.hasOwnProperty(node.parentId)) {
        //如果是有parentId的子节点,减去父节点坐标的位置
        node.position.x = node.position.x - parentNodeLayoutMap[node.parentId].position.x;
        node.position.y = node.position.y - parentNodeLayoutMap[node.parentId].position.y;
      }
    });
  }

解释:多次查大模型的过程中,发现个问题,"全局识别"这个尾节点和其他普通尾节点不同的是他有parentId,大模型说,有parentId的节点算作子节点,他在实际布局时,【坐标是子节点的坐标+父节点的坐标】,一下我就恍然大悟了

相关推荐
霸道流氓气质4 分钟前
Java中信号量(Semaphore):从本地到分布式
java·开发语言·分布式
路溪非溪35 分钟前
Python语言的执行流程总结
开发语言·python
cindershade43 分钟前
用原生 HTML5 视频与 Canvas 实现浏览器端视频抽帧封面
前端
民乐团扒谱机43 分钟前
【超详解】量子克拉美罗下界QCRB:时延估计精度极限推导+MATLAB多场景绘图实战
开发语言·机器学习·matlab·量子力学·qcrb
笨鸟先飞,勤能补拙1 小时前
Web 服务器与计算机网络全景原理
运维·服务器·前端·网络·人工智能·计算机网络·web安全
NutShell Wang1 小时前
Wails v3 Beta 实战:用显式对象模型重写你的第一个 Go 桌面应用
前端·人工智能·go·vibe coding
daols881 小时前
vue 甘特图 vxe-gantt 任务条拖拽自动更新日期
javascript·vue.js·甘特图
cindershade1 小时前
前端国际化工程实践:语言包拆分、动态加载与日期数字格式统一
前端
kisbad1 小时前
Day 036|OpenAI Agents SDK 快速开始:今天跑通第一个 Agent
java·前端·javascript
qq_267612891 小时前
Gitee CodePecker行业场景化落地指南:金融、车联网与IoT双引擎选型与工程化路径
前端·gitee·自动化