Closed Justin-lu closed 1 year ago
交互形式可以说下。 比如是否是:刚刚垂直切割完后,鼠标正好hover右侧面板,计算时机比较早!
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默认值无效
调试逻辑如下:
补充下回调声明:
/**
* 当前 document 的选中变更事件
* set callback for event on selection changed
*/
onChangeSelection(fn: (ids: string[]) => void): IPublicTypeDisposable;
详细图片如下:
初步定位问题:https://github.com/alibaba-fusion/layout/blob/next/lowcode/common/divider.tsx#L90
rect 拿到的 width 不准确