Stop Memory Leaks with componentWillUnmount Lifecycle Method in React

Kent C. Dodds
InstructorKent C. Dodds

Share this video with your friends

Send Tweet
Published 5 years ago
Updated 2 years ago

In this lesson, we have a stopwatch component that will update the time since it was run in milliseconds. The problem is, if you unmount the component, there is a memory leak because the interval that is set when you start and the timer is not stopped. React provides the componentWillUnmount lifecycle method as an opportunity to clear anything that needs to be cleared when the component is unmounted or removed from the DOM.

[00:00] There's actually a pretty serious bug in this implementation, and I added this checkbox to show and hide our stopwatch so that we can reveal this bug. When I uncheck it, it actually removes the component from the dom. When I check it again, it'll re-add it and create a brand-new instance and re-render that.

[00:17] If I go ahead and add a callback here inside of set state call and I console log this.state.laps, and then we pop open our developer console and I hit start, I'm going to see this number being incremented a millions times logged to the console.

[00:35] Then if I click on show stopwatch to un-show it, we're actually going to get this warning. It actually isn't doing anything wrong in our application, but it is indicative of a memory leak. That's exactly what's happening here.

[00:48] We need to fix this memory leak. The problem is that the set interval is never cleared, so we need to go ahead and clear that. Let's go ahead and do that with component will unmount. Right before React removes the component from the page, it's going to call this function.

[01:03] We'll simply say clear interval this.timer. Now, we can start, and then remove the stopwatch, and it's totally gone. We don't see the logs anymore and we don't get that warning.

Jose
Jose
~ 5 years ago

This is a brilliant bug to point out and fix. I certainly wouldn't have caught it unless I had the console open. What other sorts of memory leaks do we need to keep an eye out for, aside from circular references, clear intervals, and clear timeouts?

Kent C. Dodds
Kent C. Doddsinstructor
~ 5 years ago

Thanks Jose. There's also subscriptions. A bunch of different things that will leave instance functions referenced by something else. Good luck!

Efe Mumoglu
Efe Mumoglu
~ 3 years ago

Hi, Excellent course! To improve this class, it would be great if you shortly mention that 'state' is a predefined object of the Component and setState is a method of the Component that updates state object and triggers render for the component (just like the one setState function we wrote in the previous class). Sometimes it gets vague what is a framework variable name, and what is custom variable.

David Dean
David Dean
~ 3 years ago

There is so much packed in this relatively compact course. It's great that you still make time for this real life issue.

Ankur Jain
Ankur Jain
~ 3 years ago

Hi, just wanted to understand why do we need arrow function for event handlers, when i am using normal class functions, i am getting 'this' as undefined. It would be great if i can have some light on this. Thanks!

Ankur Jain
Ankur Jain
~ 3 years ago

Hi, Got the answer in the next Lesson. Thanks Kent for the great course!