⏱️ React Class Component Lifecycle Methods – Complete Guide (2025)
🧲 Introduction – What Is a Component Lifecycle?
In React.js, class components follow a well-defined lifecycle consisting of methods that are called in a specific order during a component’s existence. These lifecycle methods allow developers to initialize state, respond to updates, and clean up resources before a component is removed from the DOM.
While React Hooks (useEffect, useLayoutEffect) are the modern standard in functional components, understanding the class lifecycle methods is essential for working with legacy codebases or advanced component logic.
🎯 In this guide, you’ll learn:
- The three main phases of the class lifecycle
- When and how to use each lifecycle method
- Common use cases, examples, and best practices
- Deprecated methods and what to avoid
🧬 Lifecycle Phases in React Class Components
React class components go through three key phases:
| Phase | Description |
|---|---|
| Mounting | Component is being inserted into the DOM |
| Updating | Component is being re-rendered due to changes |
| Unmounting | Component is being removed from the DOM |
🏗️ 1. Mounting Phase Methods
These methods are called in the following order when the component is first created and added to the DOM:
✅ constructor()
- Used to initialize state and bind methods
- Avoid side effects (no DOM access)
constructor(props) {
super(props);
this.state = { count: 0 };
}
✅ static getDerivedStateFromProps(props, state)
- Called before every render (initial + updates)
- Used to derive state from props (rarely needed)
- Returns an object to update state or
null
static getDerivedStateFromProps(props, state) {
if (props.reset) return { count: 0 };
return null;
}
✅ render()
- Required method
- Pure function of
propsandstate - Returns JSX or
null
render() {
return <h1>{this.state.count}</h1>;
}
✅ componentDidMount()
- Called once after the first
render() - Safe to perform side effects (fetching, subscriptions, DOM manipulation)
componentDidMount() {
console.log('Component mounted');
fetchData();
}
🔁 2. Updating Phase Methods
Called when state or props change, or forceUpdate() is called:
✅ static getDerivedStateFromProps(props, state)
- Also used in updates (same logic as mount)
✅ shouldComponentUpdate(nextProps, nextState)
- Returns
true(default) orfalse - Use to optimize performance by preventing unnecessary renders
shouldComponentUpdate(nextProps, nextState) {
return nextState.count !== this.state.count;
}
✅ render()
- Re-renders the component with new props/state
✅ getSnapshotBeforeUpdate(prevProps, prevState)
- Called right before the DOM is updated
- Return value is passed to
componentDidUpdate
getSnapshotBeforeUpdate(prevProps, prevState) {
if (this.listRef.scrollTop > 100) {
return this.listRef.scrollHeight;
}
return null;
}
✅ componentDidUpdate(prevProps, prevState, snapshot)
- Called after the update is committed
- Ideal for API calls, syncing DOM
componentDidUpdate(prevProps, prevState, snapshot) {
if (this.props.id !== prevProps.id) {
this.fetchData();
}
}
🧹 3. Unmounting Phase Method
✅ componentWillUnmount()
- Called right before the component is removed from the DOM
- Used to clean up timers, subscriptions, listeners
componentWillUnmount() {
clearInterval(this.timer);
}
🚫 Deprecated Lifecycle Methods (Avoid Using)
| Method | Status | Replaced By |
|---|---|---|
componentWillMount() | Deprecated | Use constructor() |
componentWillReceiveProps() | Deprecated | Use getDerivedStateFromProps() |
componentWillUpdate() | Deprecated | Use getSnapshotBeforeUpdate() |
⚠️ Using these may still work but will trigger warnings in Strict Mode.
📘 Lifecycle Methods Cheat Sheet
| Phase | Method | Purpose |
|---|---|---|
| Mounting | constructor | Initialize state and bindings |
getDerivedStateFromProps | Sync state with props | |
render | Return JSX | |
componentDidMount | Perform side effects | |
| Updating | shouldComponentUpdate | Optimize re-renders |
getSnapshotBeforeUpdate | Read before DOM update | |
componentDidUpdate | Operate after updates | |
| Unmounting | componentWillUnmount | Cleanup resources |
📘 Best Practices
✅ Keep render() pure and side-effect-free
✅ Use componentDidMount() for async logic
✅ Use shouldComponentUpdate() for performance optimization
✅ Cleanup in componentWillUnmount() to prevent memory leaks
✅ Prefer useEffect and functional components for new code
📌 Summary – Recap & Next Steps
React’s class lifecycle methods provide fine-grained control over component behavior during mounting, updating, and unmounting. While functional components with Hooks are preferred today, class lifecycle methods are still important in many codebases.
🔍 Key Takeaways:
- Lifecycle methods are grouped into Mount, Update, and Unmount phases
- Use
componentDidMountandcomponentDidUpdatefor side effects - Avoid deprecated methods in new projects
- Prefer functional components with Hooks in modern React apps
⚙️ Real-World Relevance:
You’ll find class lifecycle methods in large React projects, older codebases, and complex state management tools. Understanding them is critical for migration and debugging.
❓ FAQ Section
❓ Should I still use class components in 2025?
✅ Only if working in a legacy codebase. For new projects, prefer functional components with Hooks.
❓ Is componentDidMount the same as useEffect?
✅ useEffect(..., []) in functional components is the equivalent of componentDidMount.
❓ Can I access the DOM in componentDidMount?
✅ Yes. That’s the ideal place to interact with the DOM or run timers.
❓ When is shouldComponentUpdate useful?
✅ It helps optimize performance by preventing unnecessary re-renders.
❓ Are deprecated methods still functional?
⚠️ They may still work, but will show warnings and may be removed in future React versions.
Share Now :
