• React/React Hook

[React] useEffect ์‚ฌ์šฉ๋ฒ• ๋ฐ ์˜ˆ์ œ - React Hook

Suro_1123 2023. 4. 2. 12:42

React Hook - useEffect

 

 

 

 

๐Ÿ’ฌ useEffect๋ž€?

  • ์–ด๋– ํ•œ ์ปดํฌ๋„ŒํŠธ๊ฐ€ Mount, Update, Unmount ๋˜์—ˆ์„ ๋•Œ ํŠน์ • ์ž‘์—…์„ ์‹คํ–‰
  • ์ธ์ž๋กœ๋Š” ์ฝœ๋ฐฑํ•จ์ˆ˜(Callback Function)์„ ๋ฐ›์Œ
  • Mount : ํ™”๋ฉด์— ์ฒซ ๋ Œ๋”๋ง
  • Update : ๋‹ค์‹œ ๋ Œ๋”๋ง
  • Unmount : ํ™”๋ฉด์—์„œ ์‚ฌ๋ผ์งˆ ๋•Œ

 


 

๐Ÿ˜Ž useEffect ์‚ฌ์šฉํ•˜๊ธฐ

 

App.js

 

1. ์šฐ์„  useEffect ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด import๋ฅผ ์‹œ์ผœ์ค˜์•ผํ•œ๋‹ค.

import { useEffect } from 'react';

 

2. ๊ธฐ๋ณธ์ ์ธ useEffect ๋ฌธ๋ฒ•์€ 2๊ฐ€์ง€ ํ˜•ํƒœ๊ฐ€ ์žˆ๋‹ค.

// 1๋ฒˆ
useEffect(() => {/* ์ž‘์—….. */});

// 2๋ฒˆ
useEffect(() => {/* ์ž‘์—….. */}, [value]);

1๋ฒˆ useEffect๋Š” ํ™”๋ฉด์ด ๋žœ๋”๋ง ๋  ๋•Œ๋งˆ๋‹ค ์‹คํ–‰ 

2๋ฒˆ useEffect๋Š” ํ™”๋ฉด์ด ์ฒซ ๋ Œ๋”๋ง ๋  ๋•Œ ์‹คํ–‰ํ•˜๋ฉฐ, value ๊ฐ’์ด ๋ฐ”๋€” ๋•Œ ์‹คํ–‰

(value๊ฐ’์ด ๋นˆ ๋ฐฐ์—ด์ด๋ฉด ํ™”๋ฉด์— ์ฒซ ๋ Œ๋”๋ง ๋ ๋•Œ๋งŒ ์‹คํ–‰)

(์ด value๋ฅผ Dependency Array๋ผ๊ณ  ๋ถ€๋ฆ„)

 


๐Ÿ”ฅ useEffect ์˜ˆ์‹œ

 

์ฒซ ๋ฒˆ์งธ ์˜ˆ์‹œ๋Š” ๋ฒ„ํŠผ ํด๋ฆญ์‹œ 1์”ฉ ์ฆ๊ฐ€ํ•˜๋Š” ๋Œ€ํ‘œ์ ์ธ Counter ์˜ˆ์‹œ์™€,

input์˜ value๋ฅผ ๋ฐ›์•„ ํ™”๋ฉด์— ๋„์–ด์ฃผ๋Š” ์˜ˆ์‹œ์ด๋‹ค.

 

UseEffect.js

import React, { useState, useEffect } from 'react';

const UseEffect = () => {
    const [count, setCount] = useState(1);
    const [name, setName] = useState("");

    const handleClick = () => {
        setCount(count + 1);
    }

    const handleInputChange = (e) => {
        setName(e.target.value);
    }
    
    // ๋žœ๋”๋ง ๋ ๋•Œ๋งˆ๋‹ค ๋งค๋ฒˆ ์‹คํ–‰
    useEffect(() => {
        console.log('๋žœ๋”๋ง ์™„๋ฃŒ');
    });

    return (
        <div>   
            <button onClick={handleClick}>Update</button>
            <span>Count : {count}</span>
            <div>Name : {name}</div>
            <input type="text" value={name} 
            onChange={handleInputChange}/>
        </div>
    );
};

export default UseEffect;

 

์‹คํ–‰ํ™”๋ฉด โœจ

 

 

useEffect์— Dependency Array๊ฐ€ ์—†์–ด 

Count, Input State๊ฐ€ ๋ฐ”๋€” ๋•Œ๋งˆ๋‹ค useEffect๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค.

 

๋งŒ์•ฝ ์›ํ•˜๋Š” State๊ฐ€ ๋ณ€๊ฒฝ ๋  ๋•Œ๋งˆ๋‹ค ์ฝ”๋“œ๋ฅผ ์‹คํ–‰์‹œ์ผœ์•ผ ํ•œ๋‹ค๋ฉด?

- Dependency Array์— ๊ฐ’์„ ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค.

 

 // Count๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ์‹คํ–‰
 useEffect(() => {
     console.log('๐Ÿ”ฅ Count Effect');
 }, [count]);

 // Name์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ์‹คํ–‰
 useEffect(() => {
     console.log('๐Ÿ‘€ Name Effect');
 }, [name]);

 // ์ฒซ ๋žœ๋”๋ง ๋•Œ ์‹คํ–‰
 useEffect(() => {
     console.log('๐Ÿ’ฌ ์ฒ˜์Œ ๋ Œ๋”๋ง Effect!');
 }, []);

 

์‹คํ–‰ํ™”๋ฉด โœจ

 

 

 

 


 

๐Ÿ”ฅ useEffect & Clean up ์˜ˆ์ œ

 

useEffect & clean up ์˜ˆ์‹œ๋Š” ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด console์— ํƒ€์ด๋จธ๊ฐ€ 1์ดˆ๋งˆ๋‹ค ์‹คํ–‰๋˜๋ฉฐ,

Effect_Timer๋ผ๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ Mount๋‚˜ Unmount ์‹œ์ผœ์ค€๋‹ค.

 

UseEffect.js

 

import React, { useState, useEffect } from 'react';
import Effect_Timer from './component/Effect_Timer';

const UseEffect = () => {
    const [showTimer, setShowTimer] = useState(false);

    const handleShowTimer = () => {
        setShowTimer(!showTimer)
    }
    return (
        <div>   
            {showTimer && <Effect_Timer />}
            <button onClick={handleShowTimer}>Toggle Timer</button>
        </div>
    );
};

export default UseEffect;

 

 

Effect_Timer.js

import React, { useEffect } from 'react';

const Effect_Timer = () => {
    useEffect(() => {
        const timer = setInterval(() => {
            console.log("ํƒ€์ด๋จธ ์‹คํ–‰๋˜๋Š”์ค‘...");
        }, 1000)
    }, []);

    return (
        <div>
            <span>ํƒ€์ด๋จธ๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ฝ˜์†”์„ ๋ณด์„ธ์š”.</span>
        </div>
    );
};

export default Effect_Timer;

 

์‹คํ–‰ํ™”๋ฉด โœจ

 

์‹คํ–‰ํ™”๋ฉด์„ ๋ณด๋ฉด Toggle Timer ๋ฒ„ํŠผ์„ ๋‹ค์‹œ ๋ˆŒ๋Ÿฌ๋„ ํƒ€์ด๋จธ๊ฐ€ ๊ณ„์† ์‹คํ–‰๋œ๋‹ค.

๊ทธ ์ด์œ ๋Š” Effect_Timer ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ UseEffect๋ฅผ ๋ณด๋ฉด

 

Effect_Timer.js

useEffect(() => {
     const timer = setInterval(() => {
         console.log("ํƒ€์ด๋จธ ์‹คํ–‰๋˜๋Š”์ค‘...");
     }, 1000)
 }, []);

Timer๋ฅผ ๋งŒ๋“ค์—ˆ๋Š”๋ฐ ์ข…๋ฃŒ ์‹œ์ผœ์ค„ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š์•˜๋‹ค.

์ข…๋ฃŒ ์‹œ์ผœ์ค„ ์ฝ”๋“œ๋Š” useEffect์— return์œผ๋กœ ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค.

 

 

useEffect(() => {
     const timer = setInterval(() => {
         console.log("ํƒ€์ด๋จธ ์‹คํ–‰๋˜๋Š”์ค‘...");
     }, 1000)

     return () => {
         clearInterval(timer);
         console.log("๐Ÿ”ฅ ํƒ€์ด๋จธ๊ฐ€ ์ข…๋ฃŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.");
     }
 }, []);

return์€ Effect_Timer ์ปดํฌ๋„ŒํŠธ๊ฐ€ Unmount ๋  ๋•Œ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ์ด๋‹ค.

 

 

์‹คํ–‰ํ™”๋ฉด โœจ

 

 


๐Ÿฑ‍๐Ÿ‘ค ๊ฒฐ๋ก 

1. ๋ฌด๊ฑฐ์šด ์ž‘์—…์ด ์žˆ์„ ๋•Œ useEffect ์‚ฌ์šฉ (์žฌ๋ Œ๋”๋ง ๋ฐฉ์ง€)

2. Dependency Array๊ฐ€ ์—†์œผ๋ฉด ๋ Œ๋”๋ง ๋งˆ๋‹ค ์‹คํ–‰

3. Dependency Array๊ฐ€ ์žˆ์œผ๋ฉด ์ฒซ ๋ Œ๋”๋ง, Array ๊ฐ’์ด ๋ฐ”๋€” ๋•Œ๋งˆ๋‹ค ์‹คํ–‰

4. Dependency Array๊ฐ€ ๋นˆ๊ฐ’์ด๋ฉด ์ฒซ ๋ Œ๋”๋ง ๋•Œ๋งŒ ์‹คํ–‰

5. useEffect์— return ๊ฐ’์€ clear ์ฆ‰ Unmount ๋  ๋•Œ ์‹คํ–‰ํ•  ์ฝ”๋“œ

 

 

 

'โ€ข React > React Hook' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[React] useState ์‚ฌ์šฉ๋ฒ• ๋ฐ ์˜ˆ์ œ - React Hook  (0) 2023.03.30