javascript - 为什么这些功能的工作方式不同?

标签 javascript reactjs

仅当组件尚未卸载时,我才尝试在进行 API 调用后设置属性的状态。在第一个函数中,变量“unmounted”在函数“Component”内初始化;在这种情况下,我收到此警告:“无法对已卸载的组件执行 React 状态更新。这是一个无操作,但它表明您的应用程序中存在内存泄漏。”

在第二个函数中,我全局初始化变量“unmounted”,在这种情况下,我没有收到任何警告。

显示警告:

function Component() {
  const [emailSent, setEmailSent] = useState(false);

  var unmounted = false;
  async function handleClickEvent() {
  try {
   await AuthApi.sendRecoverAccountEmail('123');
   !unmounted && setEmailSent(true);
  } catch (err) {
    !unmounted && setIsSendingEmail(false);
  }
 }

 useEffect(() => {
   return () => {
    unmounted = true;
   };
 }, []);
}

无警告:

var unmounted = false;
function Component() {
const [emailSent, setEmailSent] = useState(false);

async function handleSendEmail(formValues) {
 try {
  await AuthApi.sendRecoverAccountEmail('123');
  !unmounted && setEmailSent(true);
 } catch (err) {
  !unmounted && setIsSendingEmail(false);
 }
}

useEffect(() => {
  return () => {
   unmounted = true;
  };
 }, []);
}

谁能解释一下为什么会发生这种情况?

最佳答案

在您的第一个示例中,每次渲染后unmounted将始终为false

这是不使用全局实例的正确方法:

function Component() {
  const [emailSent, setEmailSent] = useState(false);
  const unmounted = useRef(false);

  async function handleSendEmail(formValues) {
    try {
      await AuthApi.sendRecoverAccountEmail('123');
      !unmounted.current && setEmailSent(true);
    } catch (err) {
      !unmounted.current && setIsSendingEmail(false);
    }
  }

  useEffect(() => {
    return () => {
      unmounted.current = true;
    };
  }, []);
}

关于javascript - 为什么这些功能的工作方式不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55388765/

相关文章:

javascript - 如何在点击元素时触发网页的谷歌翻译?

javascript - 为什么 "ShiftLeft"在 "ShiftRight"被保留时不触发 keyUp 事件,反之亦然?

javascript - IE 问题 : wrong tab focus

javascript - IE7 的 onclick setAttribute 解决方法

javascript - Webpack 2 + React - 使用 System.import 进行代码拆分时的嵌套路由

javascript - 在组件内 react :Unable to get this. state.name

javascript - JQuery 中具有相同 ID 的不同 Div 返回相同数据

android - React Native 样式问题。不变的违反

javascript - 将 react 添加到现有网页(旧版) - 导入不起作用

javascript - ReactJS - 父组件中 `setState` 的性能影响