[shop-project] useEffect()

kirin.logยท2021๋…„ 4์›” 27์ผ
0
post-custom-banner

๐ŸŒˆ useEffect()

  • ์ปดํฌ๋„ŒํŠธ์˜ Lifecycle์„ ๊ด€๋ฆฌํ•˜๋Š” ๊ธฐ๋Šฅ์„ ํ•œ๋‹ค.
  • React Lifecycle hook์˜ ์ผ์ข…

๐ŸŽ ์ปดํฌ๋„ŒํŠธ์˜ Lifecycle ์ด๋ž€?

์ปดํฌ๋„ŒํŠธ๋Š” ๋“ฑ์žฅ(์ƒ์„ฑ), ์—…๋ฐ์ดํŠธ(์žฌ๋ Œ๋”๋ง), ํ‡ด์žฅ(์‚ญ์ œ) ๋˜๋Š” ์ธ์ƒ์ด ์žˆ๋‹ค.
์ด ๊ณผ์ •์—์„œ hook์„ ๊ฑธ ์ˆ˜ ์žˆ๋‹ค. (= useEffect())
hook์œผ๋กœ ์ปดํฌ๋„ŒํŠธ ์ธ์ƒ ์ค‘๊ฐ„์ค‘๊ฐ„์— ๋ฌด์–ธ๊ฐ€ ๋ช…๋ น์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค.
ex) <Detail> ํ‡ด์žฅ ์ „์— ~์ข€ ํ•ด์ฃผ์„ธ์š”(๋‹ค๋ฅธํŽ˜์ด์ง€๋กœ ์ด๋™ ์ „์— ํ•ด์•ผํ•  ์ฝ”๋“œ ๊ตฌํ˜„)

  • functionํ˜•์˜ ๊ฒฝ์šฐ, hook์„ ์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
import React, { useEffect } from 'react';

function App() {

  useEffect( () => {
    // ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋“ฑ์žฅ(Mount) ๋  ๋•Œ ์‹คํ–‰ํ•  ์ฝ”๋“œ ๋“ฑ
    // ์ปดํฌ๋„ŒํŠธ๊ฐ€ update ๋  ๋•Œ ์‹คํ–‰ํ•  ์ฝ”๋“œ ๋“ฑ
    return () => { // ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์‚ฌ๋ผ์งˆ ๋•Œ(unmount) ์‹คํ–‰ํ•  ์ฝ”๋“œ }
  });

  return ()
}
  • classํ˜•์˜ ๊ฒฝ์šฐ, hook์„ ์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
class App extends React.Component {
  componentDidMount() {
    // ์ปดํฌ๋„ŒํŠธ๊ฐ€ Mount ๋  ๋•Œ ์‹คํ–‰ํ•  ์ฝ”๋“œ
  }
  componentWillUnmount() {
    // ์ปดํฌ๋„ŒํŠธ๊ฐ€ Unmount ๋  ๋•Œ ์‹คํ–‰ํ•  ์ฝ”๋“œ
  }
}

๐Ÿฃ Detail ํŽ˜์ด์ง€ ๋ฐฉ๋ฌธ ํ›„, alert ์ฐฝ์ด 2์ดˆ ํ›„์— ์‚ฌ๋ผ์ง€๊ฒŒ ํ•˜๋Š” ๊ธฐ๋Šฅ ๊ตฌํ˜„

import React, { useEffect } from 'react';

function Detail() {

  useEffect( () => {
    // alert ์ฐฝ์ด 2์ดˆ ํ›„์— ์‚ฌ๋ผ์ง€๊ฒŒ ํ•  ์ฝ”๋“œ ์ž‘์„ฑํ•˜๊ธฐ (setTimeout() ํ•จ์ˆ˜ ํ™œ์šฉ)
  });

  return (
    <div className="alert">
      <p> ์žฌ๊ณ ๊ฐ€ ์–ผ๋งˆ ๋‚จ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค</p>
    </div>
  )
}



// ๊ธฐ๋Šฅ ์ฝ”๋“œ ๊ตฌํ˜„
import React, { useEffect } from 'react';

function Detail() {

  let [alert, setAlert] = useState(true)  // alert์ฐฝ์˜ ์ƒํƒœ๋ณ€ํ™”๋ฅผ ์œ„ํ•ด state์ƒ์„ฑ

  useEffect( () => {
    let timer = setTimeout( () => { setAlert(false) }, 2000 ) 
    // 2์ดˆ ํ›„์— alert state์˜ ๊ฐ’์„ ๋ณ€๊ฒฝ(false)ํ•ด์ฃผ์„ธ์š”

    โ— ์œ„ ์ฝ”๋“œ๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ "๋“ฑ์žฅ"ํ•  ๋•Œ ์‹คํ–‰๋˜์ง€๋งŒ, "์—…๋ฐ์ดํŠธ"๋  ๋•Œ๋„ ์—ญ์‹œ ์‹คํ–‰๋ผ๋ฒ„๋ฆฐ๋‹ค!!!!!!!
      (๋“ฑ์žฅ & ์—…๋ฐ์ดํŠธ ๋  ๋•Œ ์‹คํ–‰๋˜๋Š” ์ž๋ฆฌ์ด๊ธฐ ๋•Œ๋ฌธ. ํ‡ด์žฅํ• ๋•Œ ์‹คํ–‰ํ•˜๋Š” ์ฝ”๋“œ๋Š” return ๋’ค์— ์”€)
      ๋”ฐ๋ผ์„œ setTimeout()ํ•จ์ˆ˜๋ฅผ ์ œ๊ฑฐํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ๋„ ํ•จ๊ป˜ ์จ์ค˜์•ผ ํ•œ๋‹ค.
     
    return () => { clearTimeout(timer) }
    // ์ปดํฌ๋„ŒํŠธ ํ‡ด์žฅ ๊ธฐ๋Šฅ์œผ๋กœ return () => { ์ปดํฌ๋„ŒํŠธ ํ‡ด์žฅ์‹œ ์‹คํ–‰ํ•  ์ฝ”๋“œ } ์ ์–ด์ค€๋‹ค.
    // ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ‡ด์žฅํ•  ๋•Œ setTimeout์˜ ๊ธฐ๋Šฅ์„ ์ œ๊ฑฐํ•˜๋Š” ํ•จ์ˆ˜(clearTimeout)๋ฅผ ์ ์šฉํ•œ๋‹ค

  }, [alert]); // useEffect()์‚ฌ์šฉํ•  ๋•Œ "์กฐ๊ฑด๋ฌธ"์˜ ๊ธฐ๋Šฅ์„ ํ•ด์ค€๋‹ค.
               // "alert"๋ผ๋Š” state๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งŒ useEffect()์•ˆ์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ผ๋Š” ์กฐ๊ฑด๋ฌธ
               // ๋นˆ ๋Œ€๊ด„ํ˜ธ([ ])๋กœ ๋‚จ๊ฒจ๋‘๋ฉด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋“ฑ์žฅํ•  ๋•Œ 1๋ฒˆ๋งŒ ์‹คํ–‰ํ•˜๋ผ๋Š” ์กฐ๊ฑด๋ฌธ

  return (
    // ์‚ผํ•ญ์—ฐ์‚ฐ์ž(์กฐ๊ฑด๋ฌธ)๋ฅผ ์ด์šฉํ•˜์—ฌ alert state๊ฐ€ true์ด๋ฉด ๋ณด์—ฌ์ฃผ๊ณ  false๋ฉด ์•ˆ๋ณด์—ฌ์ฃผ๊ณ 
    {
       alert === true
       ? (<div className="alert">
           <p> ์žฌ๊ณ ๊ฐ€ ์–ผ๋งˆ ๋‚จ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค</p>
          </div>)
       : null
    }
  )
}

๐Ÿ’ก useEffect() ์— ์กฐ๊ฑด๋ฌธ ๊ธฐ๋Šฅ ๋‹ฌ์•„์ฃผ๊ธฐ

useEffect( () => { ์ปดํฌ๋„ŒํŠธ๊ฐ€ "๋“ฑ์žฅ", "์—…๋ฐ์ดํŠธ", "ํ‡ด์žฅ" ์‹œ ์‹คํ–‰ํ•  ์ฝ”๋“œ}, [])

useEffect() ํ•จ์ˆ˜ ๋‚ด ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์‹คํ–‰ํ•  ์ฝ”๋“œ ๊ตฌํ˜„ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋“ฑ์žฅํ•  ๋•Œ๋งŒ ํ•ด๋‹น ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์—…๋ฐ์ดํŠธ๋  ๋•Œ๋„ ๊ฐ™์ด ์‹คํ–‰๋˜์–ด ๋‚˜์ค‘์— ๋ฒ„๊ทธ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค.
๋”ฐ๋ผ์„œ ์ฝœ๋ฐฑํ•จ์ˆ˜ ๋’ค์— ์กฐ๊ฑด๋ฌธ์„ ์„ค์ •ํ•ด ์ค„ ์ˆ˜ ์žˆ๋‹ค.

useEffect( () => { ์ปดํฌ๋„ŒํŠธ๊ฐ€ "๋“ฑ์žฅ", "์—…๋ฐ์ดํŠธ", "ํ‡ด์žฅ" ์‹œ ์‹คํ–‰ํ•  ์ฝ”๋“œ}, [state])

useEffect()ํ•จ์ˆ˜ ๋‚ด ๋‘ ๋ฒˆ์งธ ์ธ์ž์— ๋Œ€๊ด„ํ˜ธ([ ])๋กœ state๋ฅผ ๋‹ด์•„์ค€๋‹ค. ํ•ด๋‹น state๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งŒ ์ฝœ๋ฐฑํ•จ์ˆ˜ ๋‚ด ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ผ๋Š” ์˜๋ฏธ์˜ ์กฐ๊ฑด๋ฌธ์ด๋‹ค.
state๋Š” ์—ฌ๋Ÿฌ๊ฐœ๋ฅผ ๋‹ด์„ ์ˆ˜ ์žˆ๋‹ค. (๋‹ด๊ธด state๊ฐ€ ๋ชจ๋‘ ๋ณ€๊ฒฝ๋  ๋•Œ ์‹คํ–‰ํ•˜๋ผ๋Š” ์˜๋ฏธ)

๋งŒ์•ฝ, ๋Œ€๊ด„ํ˜ธ([ ])์•ˆ์— ๋นˆ ์ƒํƒœ๋กœ ๋‘๋Š”๊ฒƒ์€ ์ฒ˜์Œ ์ปดํฌ๋„ŒํŠธ ๋“ฑ์žฅ ์‹œ, ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰๋˜๊ณ  ๋๋‚˜๋ฒ„๋ฆฌ๋Š” ํšจ๊ณผ๋ฅผ ์ค„ ์ˆ˜ ์žˆ๋‹ค. ๐Ÿ“Œ๐Ÿ“Œ๐Ÿ“Œ (์—…๋ฐ์ดํŠธ ๋  ๋•Œ๋Š” ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๋œป์ด ๋œ๋‹ค)


๐ŸŽ‰๐ŸŽ‰๐ŸŽ‰ setTimeout() ์“ธ ๋•Œ ์ฃผ์˜์ !!!
๐Ÿ‘‰ ํƒ€์ด๋จธ ํ•ด์ œ ์Šคํ‚ฌ ์จ์ฃผ๊ธฐ(clearTimeout())

function Detail() {

  let [alert, setAlert] = useState(true)  

  useEffect( () => {
    let timer = setTimeout( () => { setAlert(false) }, 2000 ) 
    // ์ปดํฌ๋„ŒํŠธ๊ฐ€ "๋“ฑ์žฅ" && "์—…๋ฐ์ดํŠธ" ๋  ๋•Œ ๋ชจ๋‘ ์‹คํ–‰ ๋˜์–ด๋ฒ„๋ฆผ
    // ์•„๋ž˜ ์กฐ๊ฑด๋ฌธ ์„ค์ •์„ ํ†ตํ•ด ์ฒ˜์Œ ๋“ฑ์žฅํ•  ๋•Œ 1๋ฒˆ๋งŒ ์‹คํ–‰ํ•˜๋„๋ก ์„ค์ •ํ•˜๊ธฐ
    
    return () => { clearTimeout(timer) }
    // ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ‡ด์žฅํ•  ๋•Œ setTimeout์˜ ๊ธฐ๋Šฅ์„ ์ œ๊ฑฐํ•˜๋Š” ํ•จ์ˆ˜(clearTimeout)๋ฅผ ์ ์šฉํ•œ๋‹ค

  }, []);      // ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ฒ˜์Œ ๋“ฑ์žฅํ•  ๋•Œ 1๋ฒˆ๋งŒ ์‹คํ–‰ํ•˜๋ผ๋Š” ์กฐ๊ฑด ์„ค์ •

1) setTimeout() ์ ์šฉ (์ ์šฉ ์‹œ, ๋ณ€์ˆ˜์— ๋‹ด๋Š” ์Šต๊ด€์„ ๋“ค์ด์ž!!)
2) ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์—…๋ฐ์ดํŠธ ๋˜๋„ setTimeout์ด ๋ฐ˜๋ณต๋˜์ง€ ์•Š๋„๋ก ์กฐ๊ฑด๋ฌธ([ ])์„ ์„ค์ •ํ•ด์ฃผ์ž
3) ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ‡ด์žฅํ•  ๋•Œ(ํŽ˜์ด์ง€ ์ด๋™ ๋“ฑ) setTimeout ๊ธฐ๋Šฅ์ด ์ œ๊ฑฐ๋˜๋„๋ก clearTimeout()์„ ์„ค์ •ํ•œ๋‹ค.

profile
boma91@gmail.com
post-custom-banner

0๊ฐœ์˜ ๋Œ“๊ธ€