2. React hook

ํ•™์Šต ํ‚ค์›Œ๋“œ

  • React Hook ์ด๋ž€

  • Hooks

    • useState

    • useEffect

    • useContext

    • useRef

    • useLayoutEffect

  • React StrictMode ๋ž€

React 16.8 ์—์„œ hook์ด ๋„์ž…๋˜๊ธฐ ์ „๊นŒ์ง€๋Š”,

์ƒํƒœ๋ฅผ ๊ฐ€์ง„ ์ปดํฌ๋„ŒํŠธ๋Š” Class component๋กœ ๋งŒ๋“ค๊ณ , props๋งŒ ์‚ฌ์šฉํ•˜๋Š” ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ

์ž‘์€, ํ“จ์–ดํ•œ ์ปดํฌ๋„ŒํŠธ๋งŒ functional component๋กœ ์ž‘์„ฑํ–ˆ์—ˆ๋‹ค.

ํ˜„์žฌ๋Š” functional๋งŒ ์“ฐ๊ฒŒ๋จ.

useEffect

๋ Œ๋”๋ง ์ดํ›„์— ํ•ด์•ผํ•  ์ผ. ์ฆ‰ react์˜ ์™ธ๋ถ€์™€ ๊ด€๋ จ๋œ ์ผ์„ ์ •ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ ๋ Œ๋”๋ง ๋•Œ๋งˆ๋‹ค ์‹คํ–‰๋˜๋ฉฐ, ์˜์กด์„ฑ ๋ฐฐ์—ด์„ ์ด์šฉํ•ด ์–ธ์ œ ์ดํŽ™ํŠธ๋ฅผ ์‹คํ–‰ํ• ์ง€ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค(= ๋ถˆํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋ฆฌ๋ Œ๋” ํ•˜์ง€ ์•Š์Œ).

ํ•จ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•จ์œผ๋กœ์จ ์ข…๋ฃŒ ์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

ํƒ€์ด๋จธ ์˜ˆ์ œ

timer app - useEffect ์—ฐ์Šต๋ ˆํฌ

React์˜ ์™ธ๋ถ€์— ์šฐ์•„ํ•˜๊ฒŒ ์ ‘๊ทผํ•˜๋Š” ๋ฒ•.

์ด ์ •๋„๋Š” useEffect๋ฅผ ์•ˆ ์“ด๋‹ค๊ณ  ํฌ๊ฒŒ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์ง€๋งŒ, ์ด๋ ‡๊ฒŒ ์“ฐ๋Š” ์Šต๊ด€์„ ๋“ค์ด์ž.

useEffect(() => {
  document.title = `Now: ${new Date().getTime()}`;
});

useEffect ์•ˆ์˜ ํ•จ์ˆ˜๋ฅผ ๋ฐ–์œผ๋กœ ๋นผ๋„ ๋˜๋‚˜

ํ•จ์ˆ˜๋ฅผ ์ดํŽ™ํŠธ ์•ˆ์œผ๋กœ ์˜ฎ๊ธฐ๊ธฐ

useEffect ํด๋กœ์ €๋ผ์„œ ์•ˆ์—์„œ ์ฐธ์กฐํ•˜๋Š” ๋‹ค๋ฅธ state๊ฐ€ ์žˆ์œผ๋ฉด ๊ทธ๊ฑธ ์ฒ˜์Œ์— ๋ฐ”์ธ๋”ฉํ•ด์„œ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค.

๊ฐ€๋Šฅํ•˜๋ฉด ๋‹ค ์•ˆ์ชฝ์œผ๋กœ ๋„ฃ์œผ๋ผ๋Š” ๋ง.

cleanup๊ณผ ๊ด€๋ จํ•œ ์‚ฌ๋ก€.

์‚ฌ์‹ค ์˜ค๋Š˜ ๊ฒช์€ ๋”ฐ๋ˆ๋”ฐ๋ˆํ•œ ์‚ฌ๋ก€.

์‚ฌ์šฉ์ž list๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” modal-ui๊ฐ€ ์žˆ๋‹ค. ๋งจ ์œ„์—๋Š” ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๋“ฑ๋กํ•˜๋Š” ๋ฒ„ํŠผ์ด ์žˆ๋‹ค.

๊ทธ ๋ฐ‘์— ์‚ฌ์šฉ์ž list๋Š” ๊ฐ ๊ฐ ํฐ๋ฒ„ํŠผ์ด๋ฉฐ ๊ทธ ๋ฒ„ํŠผ ์•ˆ์— ์ˆ˜์ •, ์‚ญ์ œ ๋ฒ„ํŠผ์ด ์žˆ๋‹ค.

modal์„ ๋„๋ฉด ์•„๋ž˜์˜ ์—๋Ÿฌ๊ฐ€ warning์ด ๋ฐœ์ƒ.

Warning: Can't perform a React state update on an unmounted component.
This is a no-op, but it indicates a memory leak in your application.
To fix, cancel all subscriptions and asynchronous tasks in a useEffect cleanup

unmount๋˜๋Š” ์ปดํฌ๋„ŒํŠธ์˜ state๋ฅผ updateํ•  ์ˆ˜ ์—†๋‹ค.

์–ธ๋งˆ์šดํŠธ๋œ ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” ์ƒํƒœ๋ฅผ ์ถ”์ ํ•  ์ˆ˜ ์—†๊ณ , ์ƒํƒœ๋ฅผ ์ถ”์ ํ•˜์ง€ ์•Š๊ธฐ์— ์ž‘์—…์ด ์ˆ˜ํ–‰๋˜์ง€๋Š” ์•Š์ง€๋งŒ,

๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ, useEffect์˜ cleanup ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด๋ผ

๊ตฌ๊ธ€๋ง ํ•ด๋ณด๋ฉด useEffect ์•ˆ์— cleanup ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ํ•ด๊ฒฐํ•œ ์‚ฌ๋ก€๋ฅผ ๋งŽ์ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๋‚ด ๊ฒฝ์šฐ๋Š” useEffect ์—์„œ ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™”๊ณ , ์‚ฌ์šฉ์ž๋ฅผ ํด๋ฆญํ•ด ์„ ํƒํ• ๋•Œ๋งˆ๋‹ค useEffect๊ฐ€ ๋Œ๋„๋ก

ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. CRUD๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉฐ ๋‚ด ์ •๋ณด, ๋‚ด์ •๋ณด๋Š” ์•„๋‹ˆ์ง€๋งŒ ๋“ฑ๋กํ•œ ์‚ฌ๋žŒ์ •๋ณด, ์‚ญ์ œ, ์ˆ˜์ •, ๋“ฑ๋ก ์ด๋ฒคํŠธ๊ฐ€

์žˆ์„๋•Œ๋งˆ๋‹ค ๋‹ค์‹œ list๊ฐ€ ๋ Œ๋”๋˜๋„๋ก ํ•ด๋ฒ„๋ ธ๊ธฐ ๋•Œ๋ฌธ์— ๋™๊ธฐํ™”๋Š” ๋นจ๋ฆฌ ๋์ง€๋งŒ

์‚ฌ์šฉ์ž๋ฅผ ์„ ํƒํ• ๋•Œ๋งˆ๋‹ค ์„ธ๊ฐœ์˜ api๋ฅผ ํ˜ธ์ถœํ•˜์˜€๊ณ  pending ์ƒํƒœ์ผ๋•Œ ๋ชจ๋‹ฌ์„ ๊บผ๋ฒ„๋ ธ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ–ˆ๋‹ค.

์ผ๋‹จ ํ•œ ๊ฐœ์˜ api๋Š” ์•ž์œผ๋กœ ํ•œ๋ฒˆ๋„ ๋ณ€ํ•˜์ง€ ์•Š์•„๋„ ๋ผ์„œ ๋”ฐ๋กœ useEffect์— ๋นˆ ์˜์กด์„ฑ ๋ฐฐ์—ด๋กœ ๋‚˜๋ˆ„๊ณ 

๋‹ค๋ฅธ๊ฑด ์˜์กด์„ฑ ๋ฐฐ์—ด์„ ์ •๋ฆฌํ–ˆ๋‹ค. render๋ผ๋Š” state๋ฅผ ๋งŒ๋“ค๊ณ  list๊ฐ€ ๋ฆฌ๋ Œ๋” ๋˜์–ด์•ผํ•  ์ด๋ฒคํŠธ์— ์ถ”๊ฐ€ํ•ด์ฃผ๋Š” ์‹์œผ๋กœ.

fetch ํ•  ๋•Œ ์ฃผ์˜์‚ฌํ•ญ

page๋ฅผ ๋ฐ”๊ฟ€ ๊ฒฝ์šฐ, ์ƒˆ๋กœ ์ฝ์–ด์˜ฌ ๊ฒฝ์šฐ.

๋ฐฉ๊ธˆ ๋ถ€๋ฅธ๊ฑธ ์ทจ์†Œํ•˜์ง€ ๋ชปํ•˜๊ณ  ๋‘˜ ๋‹ค ์—…๋ฐ์ดํŠธ ๋ ์ง€ ๋ชจ๋ฅด๋‹ˆ,

๊ทธ ์ „๊บผ๋ฅผ ์ž‘๋™ํ•˜์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•. ์ข…๋ฃŒ์ฒ˜๋ฆฌ.

์œ„์— ๋‚ด ์‚ฌ๋ก€์—์„œ๋Š” ์ด๋Ÿฐ ๋ฐฉ์‹์˜ cleanup์œผ๋กœ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•˜๋Š”๋ฐ,

useEffect๋ฅผ ์—ฐ์†ํ•ด์„œ ๋ถˆ๋Ÿฌ์„œ๊ฐ€ ์•„๋‹ˆ๋ผ ํ•œ๋ฒˆ์„ ํ•˜๋”๋ผ๋„ pending์ด ๋๋‚˜๊ธฐ ์ „์— ๋ชจ๋‹ฌ์„ ๋‹ซ์•„์„œ ์ธ ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค.

๋ชจ๋‹ฌ์ด ๋‹ซํžˆ๋ฉด์„œ cleanup ํ•จ์ˆ˜์—์„œ ignore๋ฅผ ํ† ๊ธ€ํ•ด์„œ ํ˜ธ์ถœ์„ ์•ˆํ•˜๊ฒŒ ๋˜๋Š”๊ฑด๋ฐ ์‚ฌ์‹ค ๊ทธ๋Ÿผ ๊ทธ๋ ‡๊ฒŒ ํ•ด๋„ ๋˜์•ผํ–ˆ๋˜๊ฑฐ ์•„๋‹Œ๊ฐ€.

์ข€ ํ—ท๊ฐˆ๋ฆฌ๋„ค..

์ค‘์š”ํ•œ ๊ฑด, ๊ฐœ๋ฐœ์ž ๋„๊ตฌ network๋ฅผ ๋ณด๊ณ  ํ†ต์‹ ์ด ์–ด๋–ป๊ฒŒ ๋Œ์•„๊ฐ€๋Š”์ง€ ํŒŒ์•…ํ•˜๋Š” ๊ฒƒ์ด๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.

useEffect(() => {
  let ignore = false;

  async function startFetching() {
    const json = await fetchTodos(userId);
    if (!ignore) {
      setTodos(json);
    }
  }

  startFetching();

  return () => {
    ignore = true;
  };
}, [userId]);

Last updated