alibaba-fusion / layout

React Layout Components
MIT License
52 stars 19 forks source link

divider 宽度计算不准确,导致UI错位 #13

Closed Justin-lu closed 1 year ago

Justin-lu commented 1 year ago

详细图片如下:

image

image

初步定位问题:https://github.com/alibaba-fusion/layout/blob/next/lowcode/common/divider.tsx#L90

    const rect = selectedNode.getRect();

rect 拿到的 width 不准确

bindoon commented 1 year ago

交互形式可以说下。 比如是否是:刚刚垂直切割完后,鼠标正好hover右侧面板,计算时机比较早!

Justin-lu commented 1 year ago
  const onSelectionChange = useCallback((timer = 100) => {
    setDisabled(false);

    const selectedNode = getSelectedNode(engine.current);
    if (!selectedNode) {
      setCuts([]);
      return;
    }

    // TODO
    // 目前 selectionChang 时 dom 结构可能还在变化
    // 会偶尔导致 computCuts 计算尺寸出现问题,需要优化
    if (timer) {
      setTimeout(() => {
        computCuts(selectedNode);
      }, timer);
    } else {
      computCuts(selectedNode);
    }
  }, []);

  useEffect(() => {
    const { project } = engine.current;
    if (!project) return;

    project.currentDocument?.onChangeSelection(onSelectionChange);
  }, []);

  const onEnabled = useCallback(() => {
    setDisabled(false);
    onSelectionChange(0);
  }, [onSelectionChange]);

看了一下代码,这里的 回调 有点问题,手动调用的时候 onSelectionChange(0) timer是正常的 但是在 onChangeSelection 调用时,由于回调函数会默认参数传入(与timer混淆),导致timer=100默认值无效 调试逻辑如下: image

image

Justin-lu commented 1 year ago

补充下回调声明:

/**
 * 当前 document 的选中变更事件
 * set callback for event on selection changed
 */
onChangeSelection(fn: (ids: string[]) => void): IPublicTypeDisposable;
silinchen commented 1 year ago

14 pr已解决这个问题