๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
WEB/REACT

[React] ํ›…(Hooks)

by mingzoo 2021. 1. 6.

๐Ÿ“–๋ฆฌ๋‹ค๊ธฐ, ๊ณต์‹๋ฌธ์„œ, ๋…ธ๋งˆ๋“œ ์ฝ”๋”, ์ œ๋กœ์ดˆ๋‹˜์˜ ์˜์ƒ์„ ๋ณด๊ณ  ์ œ๊ฐ€ ์ดํ•ดํ•œ ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ ์ •๋ฆฌํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.๐Ÿ“–

๋ฆฌ๋‹ค๊ธฐ์—์„œ 8์žฅ์— ํ›…์— ๋Œ€ํ•œ ์„ค๋ช…์ด ๋‚˜์˜จ๋‹ค. ์˜ˆ์ œ๋ฅผ ๋”ฐ๋ผํ•˜๋ฉด์„œ ํ•ด๋ณด์•˜์ง€๋งŒ 8์žฅ๊นŒ์ง€ ํœ˜๋šœ๋ฃจ๋งˆ๋šœ๋ฃจ ๋‹ฌ๋ ค์„œ ๊ทธ๋Ÿฐ๊ฐ€ ๋‡Œ์— ๊ณผ๋ถ€ํ™”๊ฐ€ ์™€์„œ ๋จธ๋ฆฌ๊ฐ€ ๋ฐ›์•„๋“ค์ด๊ธฐ๋ฅผ ๊ฑฐ๋ถ€๋ฅผ ํ•˜๋Š” ๊ฒƒ ๊ฐ™์•˜๋‹ค.

ํ•˜์ง€๋งŒ, 8์žฅ๊นŒ์ง€ ํ–ˆ์„๋•Œ ์ด ๋ถ€๋ถ„์ด ๋น„์ค‘์ด ์žˆ๊ณ  ์ค‘์š”ํ•˜๋‹ค๊ณ  ๋Š๊ปด์กŒ๊ธฐ ๋•Œ๋ฌธ์— ํ•˜๋ฃจ ์‰ฌ๊ณ  ํ•˜๋ฃจ ๋‹ค์‹œ ๋‚  ์žก์•„์„œ ๊ณต์‹๋ฌธ์„œ์™€ ์ฑ…, ์˜์ƒ์„ ๊ฐ€๋ฆฌ์ง€ ์•Š๊ณ  ์ฐพ์•„๋ณธ ๊ฒฐ๊ณผ ์–ด๋Š ์ •๋„? ์กฐ๊ธˆ์€? ์ดํ•ด๋ฅผ ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.๐Ÿ˜ฅ

์šฐ์„  ์ œ์ผ ์ค‘์š”ํ•œ ํฌ์ธํŠธ๋Š” ๊ฐœ๋…์„ ์–ด๋Š ์ •๋„ ์ดํ•ด๋ฅผ ํ•˜๊ณ  ์˜ˆ์ œ๋ฅผ ๋‹ค์‹œ ํ•ด๋ณด๋Š”๊ฒƒ!์ด ์ดํ•ด๋ฅผ ํ•˜๋Š” ๋ฐ ๋งŽ์€ ๋„์›€์ด ๋๋‹ค.

๋˜, ๋…ธ๋งˆ๋“œ ์ฝ”๋”๋‹˜์˜ ์˜์ƒ๊ณผ ์ œ๋กœ์ดˆ๋‹˜์˜ ํ›…์— ๋Œ€ํ•œ ์˜์ƒ์ด ๋„์›€์ด ๋งŽ์ด ๋๋‹ค.


ํ›…์€ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ state๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ์ค‘์š”ํ•œ ์š”์†Œ์ด๋‹ค.

๊ทธ๋ ‡๊ธฐ์— ์—ฌ๋Ÿฌ ํ•จ์ˆ˜๋“ค์ด ์กด์žฌํ•˜๋Š”๋ฐ ์ด๋Ÿฌํ•œ ํ•จ์ˆ˜๋“ค์„ ์“ฐ๋Š” ์ˆœ์„œ๊ฐ€ ๋งค์šฐ ์ค‘์š”ํ•˜๋‹ค!

์ผ๋‹จ ๋‚ด๊ฐ€ ์ •๋ฆฌํ•œ ํ•จ์ˆ˜๋“ค์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

  • useState
  • useEffect
  • useRef
  • useMemo
  • useCallback

 

useState

import React, {useState} from 'react';

const [value, setValue] = useState(0);
//value์˜ ์ดˆ๊นƒ๊ฐ’์„ 0์œผ๋กœ ์„ค์ •
<button onClick ={() => setValue(value+1)}>+1</button>
//์ด๋Ÿฐ์‹์œผ๋กœ return ์•ˆ์— ๋„ฃ์–ด์ฃผ๊ฒŒ ๋˜๋ฉด +1์ด๋ผ๊ณ  ์“ฐ์—ฌ์žˆ๋Š” ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด value์˜ ๊ฐ’์ด 1์”ฉ ์˜ฌ๋ผ๊ฐ

 

useState๋Š” ํ™”๋ฉด ๋ Œ๋”๋ง๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ณต๊ฐ„

useState๋„ ๊ทธ๋ ‡๊ณ  ๋‚˜๋จธ์ง€ ํ›…์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ๊ผญ! ๋งจ ์œ— ์ค„์— import React, {์‚ฌ์šฉํ•˜๋Š” ํ›…} from 'react';๋ฅผ ์ ์–ด์ค˜์•ผํ•œ๋‹ค.

useState๋ฅผ ์ด์šฉํ•ด์„œ ๊ธฐ๋ณธ๊ฐ’์€ 0์œผ๋กœ ์„ค์ •ํ•˜๊ณ , [value, setValue]๋ผ๋Š” ๋ฐฐ์—ด์„ ์„ค์ •ํ–ˆ๋‹ค.

์ด ๋ฐฐ์—ด์€ [์ƒํƒœ๊ฐ’, ์ƒํƒœ๋ฅผ ์„ค์ •ํ•˜๋Š” ํ•จ์ˆ˜]์ด๋‹ค.

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

๋‚˜๋Š” ์•„์ง ํ™•์‹คํ•˜์ง€๋Š” ์•Š์ง€๋งŒ, ํ•จ์ˆ˜ํ˜•์ด ํด๋ž˜์Šคํ˜•๋ณด๋‹ค ํŽธํ•œ๊ฒƒ ๊ฐ™๋‹ค. ์™œ๋ƒํ•˜๋ฉด, ํด๋ž˜์Šคํ˜•์ฒ˜๋Ÿผ this๋ฅผ ์“ฐ์ง€ ์•Š์•„๋„ ๋˜๊ธฐ ๋•Œ๋ฌธ,,

 

useEffect

useEffect๋Š” componentDidMount, componentDidUpdate, componentWillUnmount ์ด๋ ‡๊ฒŒ ์„ธ๊ฐ€์ง€๋ฅผ ํ•ฉ์นœ๊ฑฐ๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์›๋ž˜ ๋ณดํ†ต componentDidMount, componentDidUpdate์„ ํ•ฉ์นœ๊ฑฐ๋กœ ๋ด๋„ ๋ฌด๋ฐฉํ•˜๋‹ค๊ณ  ํ•˜์ง€๋งŒ useEffect์˜ ๋‘๋ฒˆ์งธ ์š”์†Œ์— ๋นˆ ๋ฐฐ์—ด[]์„ ๋„ฃ๊ฒŒ ๋˜๋ฉด componentWillUnmount์˜ ์—ญํ• ์„ ํ•  ์ˆ˜ ์žˆ๋Š”๊ฑฐ ์•„๋‹Œ๊ฐ€?

useEffect๋Š” ๋‘๊ฐœ์˜ ์ธ์ž๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

useEffect(effect:React.EffectCallback, deps)์ด๋ ‡๊ฒŒ ๊ตฌ์„ฑ์ด ๋˜์–ด์žˆ๋‹ค.

์ด๋Š” ๋‘ ๊ฐœ์˜ ์ธ์ž๊ฐ€ ํ•„์š”ํ•œ๋ฐ, ์ฒซ๋ฒˆ์งธ๋Š” function์œผ๋กœ์„œ์˜ effectํ•จ์ˆ˜๋ฅผ ๋„ฃ๋Š” ๊ฒƒ์ด๊ณ , ๋‘๋ฒˆ์งธ ์ธ์ž๋กœ๋Š” dependencies๋ฅผ ๋„ฃ๋Š” ๊ฒƒ์ด๋‹ค.

deps๊ฐ€ ์กด์žฌํ•œ๋‹ค๋ฉด, deps๋ถ€๋ถ„์˜ ๋ฆฌ์ŠคํŠธ์— ์žˆ๋Š” ๊ฐ’์ผ ๋•Œ๋งŒ ๊ฐ’์ด ๋ณ€ํ•˜๋„๋ก ํ™œ์„ฑํ™”!

 

useEffect(() => {
	console.log(name);
},[name]);

//name์˜ ๊ฐ’์ด ๋ณ€ํ• ๋•Œ๋งŒ ์ฝ˜์†”์— name์„ ์ถœ๋ ฅ

 

useRef

์ง€๊ธˆ๊นŒ์ง€ ๋ฆฌ์•กํŠธ๋ฅผ ๊ณต๋ถ€ํ•˜๋ฉด์„œ ๋ผ์ดํ”„์‚ฌ์ดํด๊ณผ ํ›…์„ ๊ฐ€์žฅ ๋ฐ›์•„๋“ค์ด๊ธฐ๊ฐ€ ์–ด๋ ค์› ๋‹ค.

๊ทธ๋ž˜์„œ ์ด๋Ÿฐ์ €๋Ÿฐ ์ •๋ฆฌ๋˜์–ด์žˆ๋Š” ์ž๋ฃŒ๋“ค์„ ์ฐพ์•„๋ณด๋ฉด์„œ ๋‚ด ๊ฒƒ์œผ๋กœ ๋งŒ๋“ค๋ ค๊ณ  ๋งŽ์ด ๋…ธ๋ ฅํ•ด๋ดค๋‹ค.

์ œ๋กœ์ดˆ๋‹˜์ด useRef๋ฅผ ์ •๋ฆฌํ•ด๋†“์€ ์ž๋ฃŒ๋ฅผ ์ฐธ๊ณ ํ•ด๋ณด์•˜๋‹ค.

www.zerocho.com/category/React/post/5f9a7c8807be1d0004347311 

 

useRef๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฌธ๋ฒ•์—์„œ GetElementById()์™€ ๋™์ผํ•˜๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

useRef๋Š” ์–ด๋–จ๋•Œ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์„๊นŒ?

  • ํ™”๋ฉด ๋ฆฌ๋ Œ๋”๋ง๊ณผ๋Š” ๊ด€๋ จ์—†๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅ
  • ํŠน์ • DOM์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ๊ฒŒ๋” ํ•˜๋Š” ๊ธฐ๋Šฅ
    ์˜ˆ) ์—˜๋ฆฌ๋จผํŠธ์˜ ํฌ๊ธฐ ๊ฐ€์ ธ์˜ค๊ธฐ, ์Šคํฌ๋กค๋ฐ” ์œ„์น˜ ๊ฐ€์ ธ์˜ค๊ธฐ, ํฌ์ปค์Šค ์„ค์ •

useRef๋กœ ์ƒ์„ฑํ•œ ๋ฐ์ดํ„ฐ๋Š” ๋ฆฌ๋ Œ๋”๋ง๊ณผ ์ƒ๊ด€์ด ์—†๋‹ค.

 

const Ref_ex = () =>{
	const inputF = useRef(null); //์ดˆ๊ธฐ๊ฐ’์€ ์ƒ์„ฑํ• ๋•Œ ์ธ์ˆ˜๋กœ ์ž‘์„ฑํ•ด์ฃผ๋ฉด ๋จ
    ///////
    const onChange = useCallback(e=> {
    	inputF.current.focus();//์ด ์ค„์€ ์ธํ’‹์ฐฝ์— ๊ณ„์† ํฌ์ปท์Šค๊ฐ€ ๋„˜์–ด๊ฐ€๋„๋ก!
    }
    ///////
    return(
    	<>
        	<input ref={input}/>
        </>
    )
}

 

์ด๋ ‡๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ฒŒ ๋˜๋ฉด(์ค‘๊ฐ„์ค‘๊ฐ„ ์ฝ”๋“œ๋“ค์€ ๋‹ค ์ƒ๋žตํ–ˆ์œผ๋‹ˆ๊นŒ ๊ฐ์•ˆํ•˜๊ณ  ๋ด์ฃผ์„ธ์˜),useRef๋ฅผ ํ†ตํ•ด ๋งŒ๋“  ๊ฐ์ฒด ์•ˆ์˜ current ๊ฐ’์ด ์‹ค์ œ ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

์—ฌ๊ธฐ์„œ ํŠน์ดํ•œ ์ ์€ inputF์˜ ๊ฐ’์„ ๊ฐ€์ ธ์˜ฌ ๋•Œ, current๋กœ ์ ‘๊ทผํ•ด์•ผํ•˜๋Š” ๊ฒƒ์ด๋‹ค. current ์†์„ฑ์„ ์‚ฌ์šฉํ•ด์„œ ์ ‘๊ทผํ•˜๋„๋ก ํ•˜๋ผ๊ณ  ํ•œ๋‹ค.

์—ฅ ๋„๋Œ€์ฒด ์™œ? ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ๋ฐ›์•„์™€์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค!

๋ฆฌ์•กํŠธ ๊ณต์‹๋ฌธ์„œ์—์„œ ์บก์ณํ•ด์˜ด

current๋ฅผ ํ†ตํ•ด ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ๋ฐ›์•„์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ๋ฐ‘์— ๊ตต์€ ๊ธ€์ž๋กœ ์จ์ ธ์žˆ๋Š”๊ฑฐ๋Š” hook์„ ํ†ตํ•ด์„œ ํ•ด๊ฒฐ๋œ ๋ถ€๋ถ„์ด๋‹ค!

 

useMemo

useMemo๋Š” ๊ฐ’์„ ๊ธฐ์–ตํ•˜๋Š” ํ›…์ด๋‹ค.

useMemo์™€ useRef์™€ useCallback์˜ ์ฐจ์ด์ ์€ ๋ฌด์—‡์ผ๊นŒ?

useCallback๋Š” ํ•จ์ˆ˜ ์ž์ฒด๋ฅผ ์บ์‹ฑํ•˜๊ณ , useMemo๋Š” ๋ณต์žกํ•œ ํ•จ์ˆ˜ ๊ฒฐ๊ณผ๊ฐ’์„ ๊ธฐ์–ตํ•˜๊ณ , useRef๋Š” ์ผ๋ฐ˜๊ฐ’์„ ๊ธฐ์–ตํ•œ๋‹ค.

 

const LottoNums = useMemo(()=>getWinNumbers, []);

 

๋งŒ์•ฝ ์ฝ”๋“œ๊ฐ€ ์ด๋ ‡๊ฒŒ ์ž‘์„ฑ๋œ๋‹ค๋ฉด, getWinNumbers()ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋‚˜์˜จ ๋ฆฌํ„ด๊ฐ’์ด []๋ฐฐ์—ด์— ๊ธฐ์–ต๋˜๋Š” ๊ฒƒ์ด๋‹ค.

 

useCallback

ํ•จ์ˆ˜๋ฅผ ๊ธฐ์–ตํ•ด์ค˜์„œ ํ•จ์ˆ˜์ƒ์„ฑ์‹œ๊ฐ„์„ ์ค„์—ฌ์ฃผ๋Š” ๊ฒƒ

 

useCallback(() => {},[]);
useMemo(() => ๊ฐ’, []);

 

๋‘˜ ๋‹ค ํ•จ์ˆ˜๋ฅผ ์ฒซ๋ฒˆ์งธ ์ธ์ž๋กœ, ๋‘๋ฒˆ์งธ๋Š” deps๋ฐฐ์—ด์„ ๋ฐ›๋Š”๋‹ค.

ํ•˜์ง€๋งŒ, useCallback์€ ()=>{} ์ž์ฒด๋ฅผ ๊ธฐ์–ตํ•˜๋Š”๊ฑฐ๊ณ , useMemo๋Š” ๊ฐ’์„ ๊ธฐ์–ตํ•˜๋Š” ๊ฑฐ๋‹ค.

deps ์•ˆ์˜ ๊ฐ’์ด ๋ฐ”๋€” ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ ์‹คํ–‰๋œ๋‹ค.

์ฃผ์˜์‚ฌํ•ญ

๐Ÿค”์™œ ํ•จ์ˆ˜๋งˆ๋‹ค ์‚ฌ์šฉํ•˜์ง€ ์•Š์ง€?

๊ธฐ์–ต์„ ๋„ˆ๋ฌด ์ž˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ช‡๋ฒˆ์ด๊ณ  ๋ Œ๋”๋งํ•ด๋„ ์ฒซ ๊ฐ’์„ ๊ธฐ์–ต

 

์ž์‹ ์ปดํฌ๋„ŒํŠธ์— ํ•จ์ˆ˜๋กœ props๋ฅผ ๋„˜๊ธธ๋•Œ useCallback ํ•„์ˆ˜!!

์˜ˆ๋ฅผ ๋“ค์–ด, onClick={onClickRedo} ์ด๋Ÿฐ ์ฝ”๋“œ๊ฐ€ ์“ฐ์ผ ๋•Œ, ์ž์‹์ด ์“ธ๋ฐ์—†์ด ๋ฆฌ๋ Œ๋”๋ง ๋˜์ง€ ์•Š๋„๋ก ๋งŒ๋“ค์–ด์ค€๋‹ค.

 


 

๋‚˜๋ฆ„ ๊ทธ๋ž˜๋„ ํฌ์ŠคํŠธ๋ฅผ ์“ฐ๋ฉด์„œ ์ •๋ฆฌํ•ด๋ณด๋‹ˆ ๋จธ๋ฆฟ ์†์ด ์กฐ๊ธˆ ์ •๋ฆฌ๋œ ๊ฒƒ ๊ฐ™๋‹ค.

๊ทธ๋ž˜๋„, ์ด ํ›…์„ ์ ์žฌ์ ์†Œ์— ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ณ„์† ์‚ฌ์šฉํ•ด๋ณด๊ณ  ๊ณต๋ถ€ํ•ด์•ผ๋  ๊ฒƒ ๊ฐ™๋‹ค.

ํ•˜๋ฉด ํ• ์ˆ˜๋ก ๊ณต๋ถ€ํ•  ๊ฒŒ ๋Š˜์–ด๋‚˜๋Š” ๊ฒƒ ๊ฐ™์•„์„œ ๋„ˆ๋ฌด,,,,์ข‹,,,,๋‹ค,,,,^^๐Ÿคจ

728x90