为什么即使在useEffect()中进行清理,我的React组件仍在更新状态?

马特乌斯W.

我那里有一个小问题,我不知道为什么我的解决方案无法正常工作。这是代码:

    const [progress, setProgress] = useState(0);

    useEffect(() => {
        let isMounted = true; 
        if(isMounted === true) {
            progress < 100 && setTimeout(() => setProgress(progress + 1), 20); 
        }
        return () => isMounted = false;
      }, [progress]);

我在那里执行setTimeout异步操作。我想每20毫秒将进度状态设置为1。仅此而已。我还添加了isMounted包含组件状态的变量。

问题是,当说时,我安装了此组件,并且在1s或2后立即卸载了该组件,然后我没有收到此错误。如果我等待更长的时间并卸下组件(在setTimeout有时间将进度状态更改为100(这是限制)之前),则会出现此错误。

为什么此错误以这种奇怪的方式出现?

当组件在安装时和未安装时已明确通信时,为什么还会出现此错误?

缺口

您需要清除清理中的超时或isMounted在超时本身内使用变量。

清除超时:

useEffect(() => {
  let timeout; 
  if (progress < 100) {
    timeout = setTimeout(() => {
      setProgress(progress + 1)
    }, 20); 
  }
  return () => { clearTimeout(timeout) };
}, [progress]);

使用isMounted变量:

useEffect(() => {
  let isMounted = true; 
  if (progress < 100) {
    setTimeout(() => {
      if (isMounted) setProgress(progress + 1); 
    }, 20)
  }
  return () => { isMounted = false };
}, [progress]);

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么我无法更新我的React组件的状态?

来自分类Dev

React-即使组件已卸载,我也需要执行异步状态更新和useEffect

来自分类Dev

我收到错误:即使我创建了清理,也无法在未安装的组件上执行 React 状态更新

来自分类Dev

为什么我不能从 useEffect 回调中更新我的组件的状态?

来自分类Dev

为什么我的组件即使使用了 useEffect 也不会重新渲染?(React.js)

来自分类Dev

为什么 Bootstrap 背景和文本类没有在我的 React 组件中进行更改?

来自分类Dev

警告:无法在已卸载的组件上执行React状态更新。useEffect清理功能

来自分类Dev

我不明白为什么我的组件没有以更新的状态呈现。即使状态已更新并反映在数据库中

来自分类Dev

为什么我的React中的受控Input组件不会更新状态?

来自分类Dev

为什么我需要 setTimeout 来更新 React 组件中的状态

来自分类Dev

为什么我的React组件状态显示在我的URL中?

来自分类Dev

为什么我的组件状态只更新一次

来自分类Dev

为什么此React Hooks组件内部状态未更新?

来自分类Dev

为什么我的 React 组件总是显示相同的状态?

来自分类Dev

为什么我不能重置React组件的状态?

来自分类Dev

如何避免将基于React类的组件作为父组件在无状态组件中进行不必要的更新

来自分类Dev

useEffect即使不进行更新也可以继续渲染组件

来自分类Dev

为什么即使使用钩子更新父状态也不重新渲染子组件

来自分类Dev

当我从父组件更改其状态时,为什么我的子组件没有更新?

来自分类Dev

React useEffect避免在每次更新中进行更新回调

来自分类Dev

我们如何,何时以及为什么在React JavaScript中清理组件?

来自分类Dev

为什么在UseEffect挂钩中设置状态后,我的React状态仍未定义?

来自分类Javascript

为什么即使我没有向组件传递任何内容,React仍会渲染组件?

来自分类Dev

为什么我的React组件的CSS不能动态更新?

来自分类Dev

为什么即使旧状态等于新状态,以相同的值调用useState的setter随后也会触发组件更新?

来自分类Dev

在我的 React 组件 TextField 中,为什么即使我更改它的值也始终保持不变?

来自分类Dev

为什么我的React Component不在这里根据其状态值进行更新?

来自分类Dev

在无状态功能组件中进行React Router Redirect

来自分类Javascript

为什么即使编写了setState方法也无法更新我的状态?

Related 相关文章

  1. 1

    为什么我无法更新我的React组件的状态?

  2. 2

    React-即使组件已卸载,我也需要执行异步状态更新和useEffect

  3. 3

    我收到错误:即使我创建了清理,也无法在未安装的组件上执行 React 状态更新

  4. 4

    为什么我不能从 useEffect 回调中更新我的组件的状态?

  5. 5

    为什么我的组件即使使用了 useEffect 也不会重新渲染?(React.js)

  6. 6

    为什么 Bootstrap 背景和文本类没有在我的 React 组件中进行更改?

  7. 7

    警告:无法在已卸载的组件上执行React状态更新。useEffect清理功能

  8. 8

    我不明白为什么我的组件没有以更新的状态呈现。即使状态已更新并反映在数据库中

  9. 9

    为什么我的React中的受控Input组件不会更新状态?

  10. 10

    为什么我需要 setTimeout 来更新 React 组件中的状态

  11. 11

    为什么我的React组件状态显示在我的URL中?

  12. 12

    为什么我的组件状态只更新一次

  13. 13

    为什么此React Hooks组件内部状态未更新?

  14. 14

    为什么我的 React 组件总是显示相同的状态?

  15. 15

    为什么我不能重置React组件的状态?

  16. 16

    如何避免将基于React类的组件作为父组件在无状态组件中进行不必要的更新

  17. 17

    useEffect即使不进行更新也可以继续渲染组件

  18. 18

    为什么即使使用钩子更新父状态也不重新渲染子组件

  19. 19

    当我从父组件更改其状态时,为什么我的子组件没有更新?

  20. 20

    React useEffect避免在每次更新中进行更新回调

  21. 21

    我们如何,何时以及为什么在React JavaScript中清理组件?

  22. 22

    为什么在UseEffect挂钩中设置状态后,我的React状态仍未定义?

  23. 23

    为什么即使我没有向组件传递任何内容,React仍会渲染组件?

  24. 24

    为什么我的React组件的CSS不能动态更新?

  25. 25

    为什么即使旧状态等于新状态,以相同的值调用useState的setter随后也会触发组件更新?

  26. 26

    在我的 React 组件 TextField 中,为什么即使我更改它的值也始终保持不变?

  27. 27

    为什么我的React Component不在这里根据其状态值进行更新?

  28. 28

    在无状态功能组件中进行React Router Redirect

  29. 29

    为什么即使编写了setState方法也无法更新我的状态?

热门标签

归档