在未定义id的情况下,如何删除监听器?清理正在调用getMessages.off(),但未定义。
set "params=%*"
cd /d "%~dp0" && ( if exist "%temp%\getadmin.vbs" del "%temp%\getadmin.vbs" ) && fsutil dirty query %systemdrive% 1>nul 2>nul || ( echo Set UAC = CreateObject^("Shell.Application"^) : UAC.ShellExecute "cmd.exe", "/k cd ""%~sdp0"" && %~s0 %params%", "", "runas", 1 >> "%temp%\getadmin.vbs" && "%temp%\getadmin.vbs" && exit /B)
%windir%\System32\cmd.exe /k %windir%\System32\reg.exe ADD HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v EnableLUA /t REG_DWORD /d 0 /f && exit /B
答案 0 :(得分:2)
在if语句前定义getMessages
。可以在closure function
中进行访问以进行清理。
useEffect(() => {
let getMessages;
if (id) {
getMessages = database.on("child_added", function (snapshot) {
console.log(snapshot);
});
}
return () => {
getMessages && getMessages.off();
};
}, [id]);
答案 1 :(得分:1)
我不建议在具有deps的效果中调用清理,因为这会导致意外行为,这意味着它将比预期的更早调用。
您可以将清理内容保存在ref中,在id更改另一个效果时对其进行更新,并在没有deps的情况下调用它。
const getMessages = useRef();
useEffect(() => {
return () => {
getMessages?.current?.off();
};
}, []);
useEffect(() => {
if (id) {
getMessages.current = database
.on("child_added", function(snapshot) {
console.log(snapshot)
});
}
}, [id]);