React-hooks. Can't perform a React state update on an unmounted component

前端 未结 3 2034
孤独总比滥情好
孤独总比滥情好 2020-12-01 02:11

I get this error:

Can\'t perform a React state update on an unmounted component. This is a no-op, but it indicates a memory leak in your application

3条回答
  •  眼角桃花
    2020-12-01 02:39

    The easiest solution is to use a local variable that keeps track of whether the component is mounted or not. This is a common pattern with the class based approach. Here is an example that implement it with hooks:

    function Example() {
      const [text, setText] = React.useState("waiting...");
    
      React.useEffect(() => {
        let isCancelled = false;
    
        simulateSlowNetworkRequest().then(() => {
          if (!isCancelled) {
            setText("done!");
          }
        });
    
        return () => {
          isCancelled = true;
        };
      }, []);
    
      return 

    {text}

    ; }

    Here is an alternative with useRef (see below). Note that with a list of dependencies this solution won't work. The value of the ref will stay true after the first render. In that case the first solution is more appropriate.

    function Example() {
      const isCancelled = React.useRef(false);
      const [text, setText] = React.useState("waiting...");
    
      React.useEffect(() => {
        fetch();
    
        return () => {
          isCancelled.current = true;
        };
      }, []);
    
      function fetch() {
        simulateSlowNetworkRequest().then(() => {
          if (!isCancelled.current) {
            setText("done!");
          }
        });
      }
    
      return 

    {text}

    ; }

    You can find more information about this pattern inside this article. Here is an issue inside the React project on GitHub that showcase this solution.

提交回复
热议问题