Skip to content

Latest commit

ย 

History

History
127 lines (84 loc) ยท 6.12 KB

hooks.md

File metadata and controls

127 lines (84 loc) ยท 6.12 KB

๐Ÿ’ป React Hooks

๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป React Hook?

  • ๋ฆฌ์•กํŠธ ํ›…์€ React 16.8 ๋ฒ„์ „์—์„œ ์ƒˆ๋กญ๊ฒŒ ๋„์ž…๋œ ๊ธฐ๋Šฅ์ด๋‹ค. ๊ธฐ์กด์— ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ์—๋Š” ์ƒํƒœ ๊ด€๋ฆฌ๋‚˜ ๋ผ์ดํ”„์‚ฌ์ดํด์˜ ๊ธฐ๋Šฅ์ด ์žˆ์—ˆ์ง€๋งŒ, ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—๋Š” ๊ทธ๋Ÿฐ ๊ธฐ๋Šฅ๋“ค์ด ์กด์žฌํ•˜์ง€ ์•Š์•˜๋‹ค. ํ•˜์ง€๋งŒ Hook์ด ๋„์ž…๋˜๋ฉด์„œ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ๋„ ์ƒํƒœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” useState๋‚˜ ๋ Œ๋”๋ง ์งํ›„ ์ž‘์—…์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” useEffect ๋“ฑ์˜ ๊ธฐ๋Šฅ๋“ค์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฌ๋‹ค.
  • ๋ฆฌ์•กํŠธ ํ›…์ด ๋„์ž…๋˜์„œ ํด๋ž˜์Šค ๊ธฐ๋ฐ˜ ์ปดํฌ๋„ŒํŠธ, ๋ผ์ดํ”„ ์‚ฌ์ดํด ๋ฉ”์„œ๋“œ, this์˜ ํ•„์š”์„ฑ์ด ์‚ฌ๋ผ์กŒ๋‹ค. ๋˜ํ•œ, ๊ณตํ†ต ๊ธฐ๋Šฅ์„ ์ปค์Šคํ…€ hook์œผ๋กœ ๋งŒ๋“ค์–ด์„œ ๋กœ์ง์„ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฌ์›Œ์กŒ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ ์ปดํฌ๋„ŒํŠธ ์ž์ฒด์—์„œ ๋กœ์ง์„ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด์„œ ์ฝ๊ธฐ ์‰ฝ๊ณ  ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์‰ฌ์šด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป React Hook ์ข…๋ฅ˜

useState

import React, { useState } from "react";

const [data, setData] = useState("");
  • ๋Œ€ํ‘œ์ ์ธ Hook์ด๋‹ค. ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ๋„ ๊ฐ€๋ณ€์ ์ธ ์ƒํƒœ๋ฅผ ์ง€๋‹ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋ฉฐ, ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•ด์•ผ ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
  • useState()๋ผ๋Š” ํ•จ์ˆ˜๋Š” ๋ฐฐ์—ด์„ ๋ฆฌํ„ดํ•˜๋„๋ก ๋˜์–ด์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ตฌ์กฐ๋ถ„ํ•ด ํ• ๋‹น ๋ฐฉ์‹์œผ๋กœ ํ• ๋‹น ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ฒซ ๋ฒˆ์งธ๋Š” State์˜ ๊ฐ’, ๋‘ ๋ฒˆ์งธ๋Š” State ๋ณ€๊ฒฝ ํ•จ์ˆ˜์ด๋‹ค.
์ƒํƒœ๊ด€๋ฆฌ๋ž€?
์ผ๋ฐ˜์ ์œผ๋กœ ์ƒํƒœ๊ด€๋ฆฌ๋ผ ํ•จ์€๋ณ€ํ™”ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋“ค์„ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ธ๋ฐ, ์ƒํƒœ์˜ ์ดˆ๊ธฐ ๊ฐ’์„ ์ €์žฅํ•˜๊ฑฐ๋‚˜,
ํ˜„์žฌ ์ƒํƒœ์˜ ๊ฐ’์„ ์ฝ๊ฑฐ๋‚˜, ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋กœ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•˜๋Š” ๋“ฑ์˜ ํ–‰์œ„๋ฅผ ๋œปํ•œ๋‹ค.

useEffect

import React, { useEffect } from "react";

useEffect(() => {
  // ...
}, []);
  • useEffect๋Š” ๋ผ์ดํ”Œ ์‚ฌ์ดํด ๋ฉ”์„œ๋“œ์™€ ๊ด€๋ ค์ด ์žˆ๋‹ค. ๊ธฐ์กด ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์˜ ๋ผ์ดํ”Œ ์‚ฌ์ดํด ๋ฉ”์„œ๋“œ ์ค‘ componentDidMount์™€ componentDidUpdate, componentWillUnmount ๋ฅผ ํ•ฉ์นœ ํ˜•ํƒœ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.
  • ์ฒ˜์Œ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งˆ์šดํŠธ ๋  ๋•Œ ํ•œ ๋ฒˆ ๋™์ž‘ํ•œ๋‹ค. โ†’ componentDidMount
  • useEffect์˜ ๋‘๋ฒˆ์งธ ์ธ์ž์ธ ์˜์กด์„ฑ ๋ฐฐ์—ด๋กœ ์ง€์ •ํ•œ state์˜ ๊ฐ’์ด ๋ณ€ํ™”ํ•  ๋•Œ๋งˆ๋‹ค ๋™์ž‘ํ•œ๋‹ค. โ†’ componentDidUpdate
  • useEffect ๋‚ด๋ถ€์—์„œ return์„ ํ†ตํ•ด componentWillUnmount ๋ฉ”์„œ๋“œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ๋’ท์ •๋ฆฌ ํ•จ์ˆ˜๋ผ๊ณ ๋„ ํ•œ๋‹ค.
  • ๋งŒ์•ฝ, useEffect์˜ ๋‘๋ฒˆ์งธ ์ธ์ž์ธ ์˜์กด์„ฑ ๋ฐฐ์—ด์„ ์•„์— ์ž…๋ ฅํ•˜์ง€ ์•Š์œผ๋ฉด state๊ฐ€ ๋ฐ”๋€” ๋•Œ๋งˆ๋‹ค ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋น„ํšจ์œจ์ ์ด๋‹ค.
  • ๋˜ํ•œ, ์˜์กด์„ฑ ๋ฐฐ์—ด์„ ๋นˆ ๋ฐฐ์—ด๋กœ ๋„ฃ๋Š” ๊ฒฝ์šฐ์—๋Š” ๋งˆ์šดํŠธ๊ฐ€ ๋œ ํ›„ ๋”ฑ! ํ•œ๋ฒˆ๋งŒ ์ž‘๋™ํ•œ๋‹ค.

useLayoutEffect

import React, { useEffect } from "react";

useLayoutEffect(() => {
  // ...
}, []);
  • useLayoutEffect๋Š” useEffect์™€ ๋น„๊ตํ•ด์„œ ์ดํ•ดํ•˜๋ฉด ํŽธ๋ฆฌํ•˜๋‹ค.
  • useEffect๋Š” ์ปดํฌ๋„ŒํŠธ๋“ค์ด render๋˜๊ณ , paint ํ›„์— ์ฆ‰, Mount(๋งˆ์šดํŠธ)๋  ๋•Œ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋œ๋‹ค. paint๋œ ํ›„์— ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— useEffect์—์„œ DOM์— ์˜ํ–ฅ์„ ์ฃผ๋Š” ์ฝ”๋“œ๊ฐ€ ์žˆ์œผ๋ฉด ์‚ฌ์šฉ์ž ์ž…์žฅ์—์„œ๋Š” ๊นœ๋นก์ด๋Š” ํ˜„์ƒ์„ ๊ฒฝํ—˜ํ•œ๋‹ค.
  • ๊ทธ์— ๋ฐ˜ํ•ด, useLayoutEffect๋Š” ์ปดํฌ๋„ŒํŠธ๋“ค์ด render๋œ ํ›„์— ์‹คํ–‰๋˜๊ณ  ๊ทธ ํ›„์— paintํ•œ๋‹ค. ๋˜ํ•œ ์ด๋Ÿฐ ๊ณผ์ •์ด ๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋œ๋‹ค. ๋”ฐ๋ผ์„œ paint ๋˜๊ธฐ์ „์— ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— dom ์„ ์กฐ์ž‘ํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์กด์žฌํ•˜๋”๋ผ๋„ ์‚ฌ์šฉ์ž๋Š” ๊นœ๋นก์ž„์„ ๊ฒฝํ—˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ด๋ ‡๊ฒŒ๋งŒ๋ณด๋ฉด useLayoutEffect๊ฐ€ useEffect๋ณด๋‹ค ๋” ์ข‹๊ฒŒ ๋Š๊ปด์งˆ ์ˆ˜ ์žˆ๊ฒ ์ง€๋งŒ, ๋ฐ˜๋Œ€๋กœ useLayoutEffect์˜ ๋‚ด๋ถ€ ๋กœ์ง์ด ๋ณต์žกํ•˜๋ฉด ์‚ฌ์šฉ์ž ์ž…์žฅ์—์„œ๋Š” ํ™”๋ฉด์„ ๋ณด๋Š”๋ฐ๊นŒ์ง€ ์‹œ๊ฐ„์ด ์˜ค๋ž˜๊ฑธ๋ฆฐ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.
  • ๊ฒฐ๋ก ์€, ๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” useEffect๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•˜๊ณ , ํ™”๋ฉด์ด ๊นœ๋นก์ด๋Š” ์ƒํ™ฉ์ผ ๋•Œ ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ์œ„ํ•ด์„œ๋Š” useLayoutEffect๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.

useRef

import React, { useRef } from "react";

const ref = useRef(null);
  • ๋ฆฌ์•กํŠธ๋กœ ์ž‘์—…ํ•˜๋‹ค ๋ณด๋ฉด DOM ์š”์†Œ์— ์ง์ ‘ ์ ‘๊ทผํ•ด์•ผ ํ•  ๋•Œ๊ฐ€ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํŠน์ • DOM ์š”์†Œ์— focus๋ฅผ ์ฃผ๊ฑฐ๋‚˜ DOM ์š”์†Œ์˜ ํฌ๊ธฐ๋‚˜ ์Šคํฌ๋กค ์œ„์น˜๋ฅผ ์•Œ๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ์ด๋‹ค. ์ด๋•Œ ref ์†์„ฑ์„ ์ด์šฉํ•˜๋ฉด DOM ์š”์†Œ์— ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ref.current ์†์„ฑ์„ ํ†ตํ•ด์„œ ์ง์ ‘ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ์ด์™ธ์—๋„, ๊ฐ’์ด ๋ณ€ํ•ด๋„ ๋ฆฌ๋ Œ๋”๋งํ•˜์ง€ ์•Š๋Š” ๋ณ€์ˆ˜๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์šฉ๋„๋กœ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

useCallback

import React, { useCallback } from "react";

const func = useCallback(() => {
  //...
}, []);
  • ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง ๋  ๋•Œ๋งˆ๋‹ค ํ•จ์ˆ˜๋ฅผ ์ƒˆ๋กœ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ์žฌ์‚ฌ์šฉํ•˜๊ณ , ๋‘ ๋ฒˆ์งธ ์ธ์ž์ธ ์˜์กด์„ฑ ๋ฐฐ์—ด์— State ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ๋งŒ ์ƒˆ๋กœ ์ƒ์„ฑํ•˜๋„๋ก ํ•ด์„œ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” Hook์ด๋‹ค.
  • ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ํ›…์ด๋‹ค. ๋ฉ”๋ชจ์ด์ œ์ด์…˜์ด๋ž€ ๊ณ„์‚ฐ ๋œ ๊ฐ’์„ ์ž๋ฃŒ ๊ตฌ์กฐ์— ์ €์žฅํ•˜๊ณ  ์ดํ›„ ๊ฐ™์€ ๊ณ„์‚ฐ์„ ๋ฐ˜๋ณตํ•˜์ง€ ์•Š๊ณ  ์ž๋ฃŒ ๊ตฌ์กฐ์—์„œ ๊บผ๋‚ด ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

useMemo

import React, { useMemo } from "react";

const value = useMemo(() => {
  //...
}, []);
  • ํŠน์ • ๊ฒฐ๊ณผ ๊ฐ’์„ ์žฌ์‚ฌ์šฉํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” Hook์ด๋‹ค. ๋‘ ๋ฒˆ์งธ ์ธ์ž์ธ ์˜์กด์„ฑ ๋ฐฐ์—ด์— State ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ๋งŒ ์—ฐ์‚ฐํ•˜๋ฏ€๋กœ ์ตœ์ ํ™”๊ฐ€ ๊ฐœ์„ ๋œ๋‹ค.
  • useCallback๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ํ›…์ด๋‹ค. ๋‘˜์˜ ์ฐจ์ด๋Š” ํŠน์ • ๊ฒฐ๊ณผ์˜ ๊ฐ’์„ ์žฌ์‚ฌ์šฉํ•˜๋ƒ, ํ•จ์ˆ˜๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๋ƒ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.

useContext

  • ๊ธฐ์กด์˜ React์— ์กด์žฌํ•˜๋Š” Context API๋ฅผ ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” Hook์ด๋‹ค.

useReducer

  • ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ๊ฐ’์„ ๋ฆฌ๋•์Šค์˜ ๋ฆฌ๋“€์„œ์ฒ˜๋Ÿผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” Hook์ด๋‹ค.
  • useReducer๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ ์—…๋ฐ์ดํŠธ ๋กœ์ง์„ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ถ„๋ฆฌ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. ์ƒํƒœ ์—…๋ฐ์ดํŠธ ๋กœ์ง์„ ์ปดํฌ๋„ŒํŠธ ๋ฐ”๊นฅ์— ์ž‘์„ฑํ•  ์ˆ˜๋„ ์žˆ๊ณ , ์‹ฌ์ง€์–ด ๋‹ค๋ฅธ ํŒŒ์ผ์— ์ž‘์„ฑ ํ›„ ๋ถˆ๋Ÿฌ์™€์„œ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

์ฐธ๊ณ 

https://www.notion.so/a42647e064864e469b66acacfe69652b