Can't perform a React state update on an unmounted component报错解决

 更新时间:2022年12月05日 10:05:01   作者:Borislav Hadzhiev  
这篇文章主要为大家介绍了Can't perform a React state update on an unmounted component报错解决方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

总览

为了解决"Warning: Can't perform a React state update on an unmounted component" ,可以在你的useEffect钩子中声明一个isMounted布尔值,用来跟踪组件是否被安装。一个组件的状态只有在该组件被挂载时才会被更新。

import {useState, useEffect} from 'react';
const App = () => {
  const [state, setState] = useState('');
  useEffect(() => {
    // 👇️ set isMounted to true
    let isMounted = true;
    async function fetchData() {
      const result = await Promise.resolve(['hello', 'world']);
      // 👇️ only update state if component is mounted
      if (isMounted) {
        setState(result);
      }
    }
    fetchData();
    return () => {
      // 👇️ when component unmounts, set isMounted to false
      isMounted = false;
    };
  }, []);
  return (
    <div>
      <h2>State: {JSON.stringify(state)}</h2>
    </div>
  );
};
export default App;

当我们试图更新一个未挂载的组件的状态时,会出现"无法在未挂载的组件上执行React状态更新"的警告。

isMounted

摆脱该警告的直截了当的方式是,在useEffect钩子中使用isMounted布尔值来跟踪组件是否被挂载。

useEffect中,我们初始化isMounted布尔值为true

我们的fetchData 函数执行一些异步的任务,最常见的是一个API请求,并根据响应来更新状态。

然而,需要注意的是,我们只有当isMounted变量被设置为true时,才会更新状态。

async function fetchData() {
  const result = await Promise.resolve(['hello', 'world']);
  // 👇️ only update state if component is mounted
  if (isMounted) {
    setState(result);
  }
}

这可以帮助我们避免警告,因为如果组件没有挂载,我们就不会更新状态。

当组件卸载时,从useEffect钩子返回的函数会被调用。

return () => {
  // 👇️ when component unmounts, set isMounted to false
  isMounted = false;
};

我们设置isMounted变量为false,表示该组件不再挂载。如果fetchData函数在组件卸载时被调用,if代码块不会执行是因为isMounted设置为false

async function fetchData() {
  const result = await Promise.resolve(['hello', 'world']);
  // 👇️ only update state if component is mounted
  if (isMounted) {
    setState(result);
  }
}

提取

如果经常这样做,可以将逻辑提取到可重用的钩子中。

import {useState, useEffect, useRef} from 'react';
// 👇️ extract logic into reusable hook
function useIsMounted() {
  const isMounted = useRef(false);
  useEffect(() => {
    isMounted.current = true;
    return () => {
      isMounted.current = false;
    };
  });
  return isMounted;
}
const App = () => {
  const [state, setState] = useState('');
  // 👇️ use hook
  const isMountedRef = useIsMounted();
  useEffect(() => {
    async function fetchData() {
      const result = await Promise.resolve(['hello', 'world']);
      // 👇️ only update state if component is mounted
      if (isMountedRef.current) {
        setState(result);
      }
    }
    fetchData();
  }, [isMountedRef]);
  return (
    <div>
      <h2>State: {JSON.stringify(state)}</h2>
    </div>
  );
};
export default App;

useRef()钩子可以传递一个初始值作为参数。该钩子返回一个可变的ref对象,其.current属性被初始化为传递的参数。

我们在useIsMounted钩子中跟踪组件是否被挂载,就像我们直接在组件的useEffect钩子中做的那样。

需要注意的是,在fetchData函数中,我们必须检查isMountedRef.current 的值,因为ref上的current属性是ref的实际值。

翻译原文链接:bobbyhadz.com/blog/react-…

以上就是Can't perform a React state update on an unmounted component报错解决的详细内容,更多关于React state update报错的资料请关注脚本之家其它相关文章!

相关文章

  • React前端路由应用介绍

    React前端路由应用介绍

    前端应用大多数是SPA(单页应用程序),也就是只有一个HTML页面的应用程序。因为它的用户体验更好、对服务器压力更小,所以更受欢迎。为了有效的使用单个页面来管理多页面的功能,前端路由应运而生
    2022-09-09
  • React报错之Parameter event implicitly has an any type解决

    React报错之Parameter event implicitly has a

    这篇文章主要为大家介绍了React报错之Parameter event implicitly has an any type,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • React错误边界Error Boundaries

    React错误边界Error Boundaries

    错误边界是一种React组件,这种组件可以捕获发生在其子组件树任何位置的JavaScript错误,并打印这些错误,同时展示降级UI,而并不会渲染那些发生崩溃的子组件树
    2023-01-01
  • 浅谈React Event实现原理

    浅谈React Event实现原理

    这篇文章主要介绍了浅谈React Event实现原理,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-09-09
  • React如何解决fetch跨域请求时session失效问题

    React如何解决fetch跨域请求时session失效问题

    这篇文章主要给大家介绍了关于React如何解决fetch跨域请求时session失效问题的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-11-11
  • 关于React状态管理的三个规则总结

    关于React状态管理的三个规则总结

    随着 JavaScript 单页应用开发日趋复杂,JavaScript 需要管理比任何时候都要多的 state (状态),这篇文章主要给大家介绍了关于React状态管理的三个规则,需要的朋友可以参考下
    2021-07-07
  • 前端 react 实现图片上传前压缩(缩率图)

    前端 react 实现图片上传前压缩(缩率图)

    这篇文章主要介绍了前端 react 实现图片上传前压缩(缩率图),本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-08-08
  • react中ref获取dom或者组件的实现方法

    react中ref获取dom或者组件的实现方法

    这篇文章主要介绍了react中ref获取dom或者组件的实现方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • 深入浅析React refs的简介

    深入浅析React refs的简介

    React中的Refs提供了一种方式,允许我们访问DOM节点或在render方法中创建的React元素,本文给大家介绍react refs的相关知识,感兴趣的朋友一起看看吧
    2021-07-07
  • react18 hooks自定义移动端Popup弹窗组件RcPop

    react18 hooks自定义移动端Popup弹窗组件RcPop

    这篇文章主要介绍了react18 hooks自定义移动端Popup弹窗组件RcPop,react-popup 基于react18+hook自定义多功能弹框组件,整合了msg/alert/dialog/toast及android/ios弹窗效果,需要的朋友可以参考下
    2023-08-08

最新评论