DEV Community

Cover image for React Lifecycle Methods: A Step-by-Step Guide
Vishal Yadav
Vishal Yadav

Posted on

React Lifecycle Methods: A Step-by-Step Guide

When working with React components, understanding their lifecycle methods is crucial for managing their behavior and side-effects effectively. React components go through different phases such as mounting, updating, and unmounting, and each phase offers specific lifecycle methods to help you control what happens during the component's life. This guide will walk you through each phase and its associated methods.

Table of Contents

  1. Mounting
    • Constructor
    • getDerivedStateFromProps
    • render
    • componentDidMount
  2. Updating
    • getDerivedStateFromProps
    • shouldComponentUpdate
    • render
    • getSnapshotBeforeUpdate
    • componentDidUpdate
  3. Unmounting
    • componentWillUnmount

react

1. Mounting Phase

The mounting phase happens when a component is created and inserted into the DOM for the first time. The following lifecycle methods are called in order during this phase:

1.1 Constructor

Purpose: Initializes the component's state and binds event handlers.

Usage: Called before the component is mounted. Used to set up the initial state or to bind methods.



constructor(props) {
    super(props);
    this.state = { count: 0 };
}


Enter fullscreen mode Exit fullscreen mode

Key Points:

  • Always call super(props) to ensure the this context is properly set up.
  • Avoid side-effects in the constructor.

1.2 getDerivedStateFromProps (Static Method)

Purpose: Synchronize state with props before the component renders.

Usage: Invoked before every render, including during the initial mounting. Can be used to update state based on props.



static getDerivedStateFromProps(nextProps, prevState) {
    if (nextProps.value !== prevState.value) {
        return { value: nextProps.value };
    }
    return null;
}


Enter fullscreen mode Exit fullscreen mode

Key Points:

  • It’s static and does not have access to this.
  • Returns an object to update the state or null if no changes are needed.

1.3 Render

Purpose: Returns the JSX representing the component's UI.

Usage: Pure function responsible for returning elements to be displayed.



render() {
    return <div>{this.state.count}</div>;
}


Enter fullscreen mode Exit fullscreen mode

Key Points:

  • Should be side-effect free.
  • The render method is required for class components.

1.4 componentDidMount

Purpose: Handle side-effects like data fetching or DOM manipulation.

Usage: Invoked immediately after the component is mounted.



componentDidMount() {
    fetchData().then(data => this.setState({ data }));
}


Enter fullscreen mode Exit fullscreen mode

Key Points:

  • Commonly used for API calls, setting timers, or subscribing to events.
  • By this point, the component and its child components have been rendered.

2. Updating Phase

This phase occurs when a component is re-rendered due to changes in props or state. The lifecycle methods called in this phase allow you to control the rendering and updating behavior.

2.1 getDerivedStateFromProps (Same as Mounting Phase)

React calls this method again during updates. The usage remains the same as in the mounting phase. It helps synchronize state with incoming props.

2.2 shouldComponentUpdate

Purpose: Optimize performance by preventing unnecessary re-renders.

Usage: Returns true (default) or false to allow or prevent updates. Useful for performance optimization.



shouldComponentUpdate(nextProps, nextState) {
    return nextState.count !== this.state.count;
}


Enter fullscreen mode Exit fullscreen mode

Key Points:

  • This method is used for optimizing component re-renders based on props or state changes.
  • Returns true by default, meaning the component will re-render unless you override this method.

2.3 Render (Same as Mounting Phase)

The render method is called again in the updating phase to re-render the component with new state or props. The behavior remains the same as during the mounting phase.

2.4 getSnapshotBeforeUpdate

Purpose: Capture information from the DOM before it changes.

Usage: Runs before the DOM is updated and provides a snapshot to componentDidUpdate(). It's useful for tracking properties like scroll positions.



getSnapshotBeforeUpdate(prevProps, prevState) {
    if (prevProps.list.length < this.props.list.length) {
        return this.listRef.scrollHeight;
    }
    return null;
}


Enter fullscreen mode Exit fullscreen mode

Key Points:

  • The snapshot returned here can be passed to componentDidUpdate() for use in post-update logic.

2.5 componentDidUpdate

Purpose: Handle side-effects after the component updates.

Usage: Called immediately after updating, it’s useful for performing actions based on the updated DOM or state.



componentDidUpdate(prevProps, prevState, snapshot) {
    if (snapshot !== null) {
        this.listRef.scrollTop = snapshot;
    }
}


Enter fullscreen mode Exit fullscreen mode

Key Points:

  • Use this method for DOM manipulations or API calls that depend on the component's updated state or props.
  • The snapshot from getSnapshotBeforeUpdate() can be used here.

3. Unmounting Phase

The unmounting phase is when a component is being removed from the DOM. This phase contains one lifecycle method.

3.1 componentWillUnmount

Purpose: Cleanup before the component is removed from the DOM.

Usage: This is where you should clear any resources like timers, subscriptions, or pending API calls.



componentWillUnmount() {
    clearInterval(this.timer);
}


Enter fullscreen mode Exit fullscreen mode

Key Points:

  • Use this method to clean up side-effects and prevent memory leaks.
  • Commonly used to clear timers, cancel API requests, and unsubscribe from events.

Conclusion

Understanding React’s lifecycle methods allows you to control how your components behave at each stage of their existence. Whether you're initializing state in the constructor, fetching data in componentDidMount, or cleaning up resources in componentWillUnmount, knowing when and how to use these methods is essential for building efficient, scalable applications.

Master these lifecycle methods, and you'll have a solid foundation for creating well-structured React components!

Top comments (0)