Home >Web Front-end >JS Tutorial >A Comprehensive Guide to Reacts useEffect Hook: Managing Side Effects in Functional Components
The useEffect hook is one of the most powerful and essential hooks in React. It allows you to perform side effects in your functional components. Side effects can include things like data fetching, manual DOM manipulation, setting up subscriptions, and cleaning up resources when a component is unmounted or updated.
Before the introduction of hooks, side effects were handled by lifecycle methods such as componentDidMount, componentDidUpdate, and componentWillUnmount in class components. useEffect consolidates all these lifecycle methods into one, making it simpler to work with side effects in functional components.
The useEffect hook is used to perform side effects in React components. It runs after the render and can be controlled with dependencies to run only when certain values change.
useEffect(() => { // Code for the side effect return () => { // Cleanup code (optional) }; }, [dependencies]);
If no dependencies array is provided, the effect will run after every render of the component.
import React, { useEffect } from 'react'; const Component = () => { useEffect(() => { console.log('Effect has run after every render'); }); return <div>Check the console</div>; };
If you pass an empty dependencies array ([]), the effect will run only once after the initial render (similar to componentDidMount in class components).
import React, { useEffect } from 'react'; const Component = () => { useEffect(() => { console.log('Effect runs only once, after the first render'); }, []); // Empty dependency array return <div>Check the console</div>; };
If you pass an array of dependencies (e.g., [count]), the effect will run whenever any value in that array changes.
useEffect(() => { // Code for the side effect return () => { // Cleanup code (optional) }; }, [dependencies]);
If your effect creates side effects that need to be cleaned up (e.g., subscriptions, timers, etc.), you can return a cleanup function from the effect. This function will be run before the effect is re-executed or when the component is unmounted.
import React, { useEffect } from 'react'; const Component = () => { useEffect(() => { console.log('Effect has run after every render'); }); return <div>Check the console</div>; };
You can control when the effect should run by using the dependencies array. The effect will run only when one of the values in the array changes.
import React, { useEffect } from 'react'; const Component = () => { useEffect(() => { console.log('Effect runs only once, after the first render'); }, []); // Empty dependency array return <div>Check the console</div>; };
import React, { useState, useEffect } from 'react'; const Component = () => { const [count, setCount] = useState(0); useEffect(() => { console.log('Effect runs when count changes:', count); }, [count]); // Dependency on count return ( <div> <p>Count: {count}</p> <button onClick={() => setCount(count + 1)}>Increment</button> </div> ); };
import React, { useState, useEffect } from 'react'; const TimerComponent = () => { const [time, setTime] = useState(0); useEffect(() => { const timer = setInterval(() => { setTime((prevTime) => prevTime + 1); }, 1000); // Cleanup function to clear the timer return () => clearInterval(timer); }, []); // Empty dependency array to run once on mount return <div>Time: {time}</div>; };
import React, { useState, useEffect } from 'react'; const Component = () => { const [count, setCount] = useState(0); const [name, setName] = useState('Alice'); useEffect(() => { console.log(`Effect runs when 'count' changes: ${count}`); }, [count]); // Only runs when count changes useEffect(() => { console.log(`Effect runs when 'name' changes: ${name}`); }, [name]); // Only runs when name changes return ( <div> <p>Count: {count}</p> <p>Name: {name}</p> <button onClick={() => setCount(count + 1)}>Increment Count</button> <button onClick={() => setName(name === 'Alice' ? 'Bob' : 'Alice')}>Change Name</button> </div> ); };
The useEffect hook is one of the most essential hooks in React, allowing you to handle side effects in a declarative way. It simplifies code by consolidating multiple lifecycle methods into one and offers greater flexibility and control over when and how effects run in your components.
The above is the detailed content of A Comprehensive Guide to Reacts useEffect Hook: Managing Side Effects in Functional Components. For more information, please follow other related articles on the PHP Chinese website!