0

I'm using a custom hook to create a behaviour of auto signOut after 3 seconds. I'm calling this hook from my main component and deciding the state of login using isLogin. After setting the credentials, setLogin function is invoked and due to useEffect setTimeout gets loaded into memory. The problem is, after 3 seconds I'm getting 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

If you think that this is not the correct way of handling such a type of scenario then please guide me.

const [isLogin, setLogin] = useState(someValue);

 useEffect(() => {
    if (tokenExist && notExpireYet) {
      setTimeout(() => remValue(), 3000);
    }
  }, [isLogin]);
        

1 Answer 1

1

The problem is your setTimeout call is called even after the component was unloaded. In order to clean up the effect properly between dependency changes, you should return a function that cleans up.

In your case, it would be something like this:

const [isLogin, setLogin] = useState(someValue);

useEffect(() => {
  if (tokenExist && notExpireYet) {
    const id = setTimeout(() => remValue(), 3000);
    return () => clearTimeout(id);
  }
  
}, [isLogin]);

This will make sure your effect doesn't run when the component is no longer there.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.