React

React Logo

React Basics: useEffect Hook

Use case: You have a function you want called whenever the component mounts (only once, when the page loads) or you want that same function to run everytime an event fires on that page (always). The useEffect hook allows a functional component to tap into lifecycle methods and other side effects in functional components like network requests, setting up event listeners and timeouts & intervals.

App.js (Basic useEffect Explained)

import React, {useState, useEffect} from "react"
import randomcolor from "randomcolor" 
/*random hex color library, you'll 
need to install it first!*/

function App() {
    const [count, setCount] = useState(0)
    const [color, setColor] = useState("")
    
    function increment() {
        setCount(prevCount => 
        prevCount + 1)
    }
    
    function decrement() {
        setCount(prevCount => 
        prevCount - 1)
    }
    
    useEffect(() => {
        setColor(randomcolor())  
        /*setColor calls randomcolor 
        function and puts it into state 
		thanks to useState hook*/
    }, [count]) /*this second attribute 
    says which event(s) to listen for to 
    run the included function. If blank, 
    it will just run once when 
    loading and that's it*/
    
    return (
        <div>
            <h1 style={{color: color}}>
                {count}</h1>
            <button onClick={increment}>
                Increment</button>
            <button onClick={decrement}>
                Decrement</button>
        </div>
    )
}

export default App

App.js (useEffect Lifecycle Hooks Explained)

import React, {useState, 
    useEffect} from "react"
import randomcolor from "randomcolor"

function App() {
    const [count, setCount] = useState(0)
    const [color, setColor] = useState("")
    
    useEffect(() => {
        const intervalId = 
        setInterval(() => {
            // setCount(
                prevCount => 
                prevCount + 1)
        }, 1000)
        return () => 
        clearInterval(intervalId) 
        /*by adding this "cleanup method"
        this is equivalent of 
        componentDidUnmount */
    }, [])
    
    useEffect(() => {
        setColor(randomcolor())
    }, [count]) //equivalent of 
    componentDidUpdate lifecycle method
	
	useEffect(() => {
        setColor(randomcolor())
    }, []) //equivalent of 
    componentDidMount lifecycle method
    
    return (
        <div>
            <h1 style={{color: color}}>{count}</h1>
        </div>
    )
}

export default App