๐Ÿ“–[React]React Hooks ์ •์˜ ๋ฐ ์ข…๋ฅ˜

ํ˜ฑยท2022๋…„ 7์›” 9์ผ

React

๋ชฉ๋ก ๋ณด๊ธฐ
8/28

๐Ÿ’— Hook์ด๋ž€?

function component์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ช‡๊ฐ€์ง€ ๊ธฐ์ˆ 
Class Component์˜ state ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ฒŒ ํ•ด์คŒ
์›ํ•˜๋Š” ์‹œ์ ์— ์ •ํ•ด์ง„ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋„๋ก (use๋ฅผ ๋ถ™์—ฌ์„œ Hook์ž„์„ ๋ช…์‹œํ•ด์•ผํ•จ)

Class Componnet์˜ ๋‹จ์ ์„ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ๋‚˜ํƒ€๋‚จ

Class Component๋Š” function Component์— ๋น„ํ•ด
์–ด๋ ค์šด ๋ฌธ๋ฒ•, ์ถ•์†Œ ๋ฐฉ์‹, Reloading์‹œ ๋–จ์–ด์ง€๋А ์‹ ๋ขฐ์„ฑ, ์ตœ์‹  ๊ธฐ์ˆ  ์ ์šฉ์— ๋ถˆ๋ฆฌํ•จ

Class Componente๋Š” Lifecycle methods, state ์ œ๊ณต ๊ทธ๋™์•ˆ Function Component๋Š” ๋น„๊ต์  ๊ฐ„๋‹จํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด์™€ ๊ด€๋ จ๋œ method๊ฐ€ ์—†์—ˆ์Œ=



๐Ÿ’— Hook์˜ ์ข…๋ฅ˜

โœ 1. useState()

state๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ Hook
state: ๊ฐ’์ด ๋ณ€ํ™”๊ฒŒ ๋˜๋ฉด ์—ฐ๊ด€๋œ ์ปดํฌ๋„ŒํŠธ๋“ค์ด ์žฌ๋žœ๋”๋ง๋˜๋Š” ๋ณ€์ˆ˜

๐Ÿ”ธ ์‚ฌ์šฉ๋ฒ•

const [state(๋ณ€์ˆ˜๋ช…), setState(setํ•จ์ˆ˜๋ช…)] = useState(์ดˆ๊ธฐ๊ฐ’); 

๐Ÿ”ธ์‹ค์ œ ์ฝ”๋“œ

import React, {useState} from 'react';
//useState ํ˜ธ์ถœํ•˜๊ธฐ 

function Example(props) {
  const [ count, setCount]=useState(0);
//useState ์„ ์–ธํ•˜๊ธฐ , 'count'๋ผ๋Š” ์ƒˆ๋กœ์šด ์ƒํƒœ ๊ฐ’์„ ์ •์˜
// ์ธ์ž๋กœ ์ดˆ๊นƒ๊ฐ’ ๋ฐ›๊ธฐ 
  
  return (
    <div>
      <p>์ด {count}๋ฒˆ ํด๋ฆญํ–ˆ์Šต๋‹ˆ๋‹ค</p>
      <button onClick = { () => setCount(count+1)}>
        ํด๋ฆญ
      </button>
    </div>
  );
}
//onClick ๋  ๋•Œ> setCount์•ˆ์— ์žˆ๋Š” ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜์–ด count ๊ฐ’์— 1์ถ”๊ฐ€ 

๋ณ€์ˆ˜ ํ•œ ๊ฐœ ๋‹น state ๊ฐ’ ํ•œ๊ฐœ์”ฉ ๋“ค์–ด๊ฐ€์•ผํ•จ



โœ 2. useEffect()

Side Effect?
-React Component ๋ Œ๋”๋ง ํ›„ ๋น„๋™๊ธฐ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ํšจ๊ณผ(ex: ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ ๋ฐ›๊ธฐ), ์‚ฌ์šฉ์ž๊ฐ€ ์š”๊ตฌํ•œ effect ์™ธ์˜ effect => Hook์ด ์ˆ˜ํ–‰ ๊ฐ€๋Šฅํ•˜๋„๋ก ์ฒ˜๋ฆฌ

useEffect: React์—์„œ Side Effect๋ฅผ ํ•จ์ˆ˜ํ˜•์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๋ฆฌ์•กํŠธ Hook, Life Cycleํ•จ์ˆ˜์˜ ๊ธฐ๋Šฅ๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰

๐Ÿ”ธ ์‚ฌ์šฉ๋ฒ•

useEffect ( function(์ดํŽ™ํŠธ ํ•จ์ˆ˜), deps(์˜์กด์„ฑ ๋ฐฐ์—ด));
//๋ฐฐ์—ด ์•ˆ์˜ ๊ฐ’์ด ํ•˜๋‚˜๋ผ๋„ ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ effectํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋จ
//deps ์œ„์น˜์˜ ๋ฐฐ์—ด ์•ˆ์— ๊ฒ€์‚ฌํ•˜๊ณ  ์‹ถ์€ ๊ฐ’์„ ๋„ฃ์œผ๋ฉด ํŠน์ • ๊ฐ’์ด ์—…๋ฐ์ดํŠธ ๋  ๋•Œ ์‹คํ–‰
useEffect ( function(์ดํŽ™ํŠธ ํ•จ์ˆ˜), []); 
//ํ•œ๋ฒˆ์”ฉ๋งŒ ์‹คํ–‰๋˜๋„๋ก ํ•  ๋•Œ ์˜์กด์„ฑ ๋ฐฐ์—ด ๋ถ€๋ถ„์— ๋นˆ ๋ฐฐ์—ด์„ ๋„ฃ์–ด์•ผ ํ•จ 

๐Ÿ”ธ ์‚ฌ์šฉ๋ฒ• ์ •๋ฆฌ

useEffect(() => {
  //์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งˆ์šดํŠธ ๋œ ์ดํ›„,
  //์˜์กด์„ฑ ๋ฐฐ์—ด์— ์žˆ๋Š” ๋ณ€์ˆ˜๋“ค ์ค‘ ํ•˜๋‚˜๋ผ๋„ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ ์‹คํ–‰๋จ
  //์˜์กด์„ฑ ๋ฐฐ์—ด์— ๋นˆ ๋ฐฐ์—ด ([])์„ ๋„ฃ์œผ๋ฉด ๋งˆ์šดํŠธ์™€ ์–ธ๋งˆ์šดํŠธ์‹œ์— ๋‹จ ํ•œ๋ฒˆ์”ฉ๋งŒ ์‹คํ–‰๋จ
  //์˜์กด์„ฑ ๋ฐฐ์—ด ์ƒ๋žต ์‹œ ์ปดํฌ๋„ŒํŠธ ์—…๋ฐ์ดํŠธ ์‹œ๋งˆ๋‹ค ์‹คํ–‰๋จ
  ...
  
  return() => {
    //์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งˆ์šดํŠธ ํ•ด์ œ๋˜๊ธฐ ์ „์— ์‹คํ–‰๋จ
    ...
  }
  }, [์˜์กด์„ฑ ๋ณ€์ˆ˜1, ์˜์กด์„ฑ ๋ณ€์ˆ˜2 ...]);

๐Ÿ”ธ ์‹ค์ œ ์ฝ”๋“œ

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

function Counter(props){
  count [count, setCount] = useState(0);
  
  //componentDidMount, componentDidUpstate์™€ ๋น„์Šทํ•˜๊ฒŒ ์ž‘๋™
  useEffect(()=> {
    //๋ธŒ๋ผ์šฐ์ € api๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ document์˜ title์„ ์—…๋ฐ์ดํŠธ ํ•ฉ๋‹ˆ๋‹ค.
    //ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ ์•ˆ์—์„œ ์„ ์–ธ๋˜๊ธฐ ๋•Œ๋ฌธ์— props, state์— ์ ‘๊ทผ ๊ฐ€๋Šฅ
    document.title = 'You Clicked ${count} times';
  });
  
  return (
    <div>
       <p>์ด {count}๋ฒˆ ํด๋ฆญํ–ˆ์Šต๋‹ˆ๋‹ค</p>
      <button onClick = { () => setCount(count+1)}>
        ํด๋ฆญ
      </button>
    </div>
  );
}
import React, {useState, useEffect} from 'react';

function UseState(props) {
  const [isOnline, setIsOnline ] = useState(null);
  
  function handleStatusChange(status) {
    setIsOnline(status, isOnline);
  }
  
  useEffect(()=> {
    ServerAPI.subscribeUserStatus(props.user.id handleStatusChange};
            return() => {
    ServerAPI.unsubscribeUserStatus(props.user.id handleStatusChange);
    //์ปดํฌ๋„ŒํŠธ๊ฐ€ unmount๋  ๋•Œ ํ˜ธ์ถœ๋จ! 
	};
});

  if (isOnline === null ){
    return '๋Œ€๊ธฐ์ค‘....';
  } return isOnline ? '์˜จ๋ผ์ธ' : '์˜คํ”„๋ผ์ธ';
 }

โœ 3. useMemo()

Memoized value๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” Hook

Memoization ์—ฐ์‚ฐ๋Ÿ‰์˜ ๊ฐ’์ด ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ €์žฅํ•ด ๋‘์—ˆ๋‹ค๊ฐ€ ํ•„์š”ํ•  ๋•Œ ๋‹ค์‹œ ๊ณ„์‚ฐํ•˜์ง€ ์•Š๊ณ  ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๊บผ๋‚ด์„œ ์žฌ์‚ฌ์šฉํ•ด์„œ ๋ฐ”๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ
Memoization์˜ ๊ฒฐ๊ด๊ฐ’ = Momoized Value

๐Ÿ”ธ ์‚ฌ์šฉ๋ฒ•

const memoizedValue = useMemo(
  () => {
    //์—ฐ์‚ฐ๋Ÿ‰์ด ๋†’์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜
    return computeExpensiveValue(์˜์กด์„ฑ ๋ณ€์ˆ˜1, ์˜์กด์„ฑ ๋ณ€์ˆ˜2);
  },
  [์˜์กด์„ฑ ๋ณ€์ˆ˜1, ์˜์กด์„ฑ ๋ณ€์ˆ˜2]
 );

const value = useMemo (()=>{
  return calculate(); //์ฝœ๋ฐฑ ํ•จ์ˆ˜: ์ฝœ๋ฐฑํ•จ์ˆ˜๊ฐ€ returnํ•˜๋Š” ๊ฐ’
}, [item]) //์˜์กด์„ฑ ๋ฐฐ์—ด: ๋ฐฐ์—ด ์•ˆ์˜ ์š”์†Œ ๊ฐ’์ด update๋  ๋•Œ๋งŒ ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ๋‹ค์‹œ ํ˜ธ์ถœ, Memoization value๋ฅผ updateํ•˜์—ฌ ๋‹ค์‹œ memoizationํ•จ

//๋ Œ๋”๋ง์ด ์ผ์–ด๋‚˜๋Š” ๋™์•ˆ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์€ useMemo์— ๋„ฃ์œผ๋ฉด ์•ˆ๋จ
//์˜์กด์„ฑ ๋ฐฐ์—ด์„ ๋„ฃ์ง€ ์•Š์„ ๊ฒฝ์šฐ, ๋งค ๋ Œ๋”๋ง๋งˆ๋‹ค ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋ฏ€๋กœ useMemo hook์„ ์‚ฌ์šฉํ•˜๋Š” ์˜๋ฏธ๊ฐ€ ์—†์–ด์ง
//์˜์กด์„ฑ ๋ฐฐ์—ด์ด ๋นˆ ๋ฐฐ์—ด์ผ ๊ฒฝ์šฐ, ์ปดํฌ๋„ŒํŠธ ๋งˆ์šดํŠธ ์‹œ์—๋งŒ ํ˜ธ์ถœ ๋จ 

๐Ÿ”ธ ์‹ค์ œ ์ฝ”๋“œ

useMemo๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์„ ๋•Œ

function calculate() {
  return 10 
}

function Component () {
  const value = calculate();
  return (<div>{value}</div>)
}

//Component๊ฐ€ ๋ Œ๋”๋ง๋  ๋•Œ๋งˆ๋‹ค value ๋ณ€์ˆ˜๊ฐ€ ์ดˆ๊ธฐํ•˜๋˜์–ด์„œ calculateํ•จ์ˆ˜๋Š” ๋ฐ˜๋ณต์ ์œผ๋กœ ํ˜ธ์ถœ๋จ, ๋”ฐ๋ผ์„œ ๋น„ํšจ์œจ์ 

useMemo๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ

function claculate() {
  return 10 
}

function Component(){
  const value=useMemo(
    ()=>calculate(), []
    )
  return (<div>{value}</div>)
}
//์ฒ˜์Œ ๊ณ„์‚ฐ๋œ ๊ฒฐ๊ณผ ๊ฐ’์„ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜์—ฌ ๋ฐ˜๋ณต์ ์œผ๋กœ ๋ Œ๋”๋ง ๋˜๋Š” ๊ฒฝ์šฐ ๊ณ„์‚ฐ๋œ ๊ฐ’์„ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๊ฐ€์ ธ์™€ ์žฌ์‚ฌ์šฉ! 

โœ 4. useCallback()

useMemo()์™€ ๋น„์Šทํ•˜์ง€๋งŒ ๊ฐ’์ด ์•„๋‹Œ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜
ํ•จ์ˆ˜ ์ž์ฒด๋ฅผ Memoization
์žฌ๋ Œ๋”๋ง๋  ๋•Œ๋งŒ์ด ์•„๋‹ˆ๋ผ, ์˜์กด์„ฑ ๋ฐฐ์—ด์ด ๋ฐ”๋€” ๋•Œ๋งŒ Memoization์—์„œ ํ•จ์ˆ˜๋ฅผ Update

๐Ÿ”ธ ์‚ฌ์šฉ๋ฒ•

const memoizedCallback = useCallback(
  ()=>{
    doSomthing(์˜์กด์„ฑ ๋ณ€์ˆ˜1, ์˜์กด์„ฑ ๋ณ€์ˆ˜2);
  }, 
  [์˜์กด์„ฑ ๋ณ€์ˆ˜1, ์˜์กด์„ฑ ๋ณ€์ˆ˜2]
  );

useCallback(ํ•จ์ˆ˜, ์˜์กด์„ฑ ๋ฐฐ์—ด); == useMemo(()=>ํ•จ์ˆ˜, ์˜์กด์„ฑ ๋ฐฐ์—ด);

๐Ÿ”ธ ์‹ค์ œ ์ฝ”๋“œ

import { useState, useCallback } from 'react';

function ParentComponent(props) {
  const [count, setCount] = useState(0);
  
  //์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งˆ์šดํŠธ ๋  ๋•Œ๋งŒ ํ•จ์ˆ˜๊ฐ€ ์ •์˜๋จ
  const handleClick = useCallback((event) => {
    //ํด๋ฆญ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ
  } []);
  
  return (
    <div>
      <button
        onClick = (()=>{
          setCount(count+1);
          }}
        >
        {count}
      </button>
      
      <ChildComponent handleClick = {handleClick}/>
      </div>
    );
}

โœ 5. useRef()

Reference๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ Hook

Reference: ํŠน์ • ์ปดํฌ๋„ŒํŠธ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด,
refObject.current: current ์†์„ฑ: ํ˜„์žฌ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” element

๐Ÿ”ธ ์‚ฌ์šฉ๋ฒ•

const refContainer = useRef(์ดˆ๊นƒ๊ฐ’);
//ํ•ด๋‹น ์ดˆ๊นƒ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”๋œ refernce๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ 

๐Ÿ”ธ ์‹ค์ œ ์ฝ”๋“œ

function TextInputWithFocusButton(props){
  const isPutElem = useRef(null);
  
  const onButtonClick = () =>{
    //'current'๋Š” ๋งˆ์šดํŠธ๋œ input element๋ฅผ ๊ฐ€๋ฆฌํ‚ด
    inputElem.current.focus();
  };
  
  return (
    <>
      <input ref = {inputElem} type="text"/>
      <button onClick={onButtonClick}>
        Focus the input
      </button>
    </>
    );
}
    
profile
new blog: https://hae0-02ni.tistory.com/

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