1 回答
TA貢獻1851條經驗 獲得超3個贊
根據 Carlene 在評論中推薦的問題,我會說沒有必要刪除事件偵聽器,因為它將由垃圾收集器處理,盡管在這種情況下某些較舊的瀏覽器可能會泄漏內存。
而且,我找到了一種在卸載之前刪除偵聽器的方法Backdrop_DIV,它可以工作:
我添加了
lastOpenState_refuseRef()對先前渲染open狀態的跟蹤,以便我可以檢測將卸載Backdrop_DIV(open === false)的渲染,并在該渲染期間移除偵聽器。
import React, {useState, useEffect, useRef, useCallback} from 'react';
function MyComponent() {
const [open,setOpen] = useState(false);
const backdrop_ref = useRef(null);
const lastOpenState_ref = useRef(false);
const handleBackdropTouchMove = useCallback(() => {
setOpen(false);
},[]);
// BLOCK TO REMOVE EVENT LISTENER FROM backdrop_ref
// SINCE IT'S IMPOSSIBLE TO REMOVE FROM THE useEffect RETURN
// BECAUSE THE backdrop_ref IS NULL WHEN IT RUNS
if (lastOpenState_ref.current === true && open === false) {
backdrop_ref.current.removeEventListener('touchmove', handleBackdropTouchMove);
}
lastOpenState_ref.current = open;
// EFFECT TO ATTACH 'touchmove' EVENT LISTENER ON 'backdrop_ref.current'
useEffect(() => {
if (open) {
backdrop_ref.current.addEventListener('touchmove', handleBackdropTouchMove);
}
},[open,handleBackdropTouchMove]);
// RETURN STATEMENT
return(
<LS.Container_DIV>
{open &&
<LS.Backdrop_DIV
onClick={handleBackdropClick}
ref={backdrop_ref}
>
</LS.Backdrop_DIV>
}
<SomeOtherStuff/>
</LS.Container_DIV>
);
}
添加回答
舉報
