如何删除清理功能上的侦听器

时间:2020-05-10 16:43:31

标签: javascript reactjs

在未定义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

2 个答案:

答案 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]);