遇到了一个有趣的问题

<FieldEditor rect={rect} visible={editStatus} onClose={() => setEditStatus(false)} />
1

子组件

const [scrollY, setScrollY] = useState<number>(0);

    useEffect(() => {
        const listener = (e: MouseEvent) => {
            const el = (e.target as HTMLDivElement).closest('.fielde-ditor__wrapper');
            if (el === null) {
                onClose();
            }
        };
        window.addEventListener('click', listener);
        return () => {
            console.log('destroy');
        };
    }, []);

if (!visible) return null;

return createPortal(
        <div className="fielde-ditor__wrapper">
            {Editor}
            {Panel}
        </div>,
        document.body,
    );
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

当visible 为false时 useEffect内的清理函数没有正常执行

猜测是组件没有正常卸载

 { editStatus && <FieldEditor rect={rect} onClose={() => setEditStatus(false)} />}
1

这样写后组件能够正常卸载了并执行清理函数