λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
"곡뢀" π‘Ÿπ‘’π‘π‘œπ‘Ÿπ‘‘/πΉπ‘Ÿπ‘œπ‘›π‘‘π‘’π‘›π‘‘

[TIL] React-Hooks μ•Œμ•„λ³΄κΈ°

by ΰ·† Yoni ΰ·† 2023. 6. 9.
728x90
ν΄λž˜μŠ€ν˜• vs ν•¨μˆ˜ν˜•

 

ReactλŠ” μ²˜μŒμ— ν΄λž˜μŠ€ν˜• μ»΄ν¬λ„ŒνŠΈμ˜ λ°©λ²•λ§Œ μ‘΄μž¬ν–ˆλ‹€.

ν•˜μ§€λ§Œ, ν΄λž˜μŠ€ν˜•μ€ μ–΄λ ΅κ³  λ³΅μž‘ν•˜μ—¬ ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈ 방법이 μƒκ²¨λ‚˜κ²Œ λ˜μ—ˆλ‹€.

ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈλŠ” ν΄λž˜μŠ€ν˜• μ»΄ν¬λ„ŒνŠΈλ³΄λ‹€ 훨씬 κ°„λ‹¨ν•˜κΈ°μ— 점점 ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈμ˜ μ‚¬μš© λΉ„μœ¨μ΄ λ†’μ•„μ§€κ²Œ λ˜μ—ˆκ³ , μš”μ¦˜ ν˜„μ—…μ—μ„œλŠ” ν΄λž˜μŠ€ν˜•λ³΄λ‹€λŠ” ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈλ₯Ό 많이 μ‚¬μš©ν•˜λŠ” 좔세라고 ν•œλ‹€.

 

ν΄λž˜μŠ€ν˜• μ»΄ν¬λ„ŒνŠΈ

import { Component } from 'react';

class Hello extends Component {
	render() {
    	return <div>ν΄λž˜μŠ€ν˜• μ»΄ν¬λ„ŒνŠΈ</div>
    }
}

export default Hello

ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈ

const Hello = () => <div>ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈ</div>

export default Hello

이 ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈλŠ” ν™”μ‚΄ν‘œ ν•¨μˆ˜λ‘œλ„ 적용이 κ°€λŠ₯ν•©λ‹ˆλ‹€.

function Hello() {
	return <div>ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈ</div>
}

export default Hello

 

κ·Έλž˜μ„œ 이게 React-Hooks와 무슨 상관인데?

 

ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈλŠ” μ‚¬μš©μ΄ κ°„νŽΈν•œ λŒ€μ‹ , κ·Έ μžμ²΄λ§ŒμœΌλ‘œλŠ” ν΄λž˜μŠ€ν˜• μ»΄ν¬λ„ŒνŠΈμ˜ λͺ¨λ“  κΈ°λŠ₯을 ν™œμš©ν•  수 μ—†λ‹€.

κ·Έλž˜μ„œ Reactμ—μ„œ ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈμ—μ„œλ„ ν΄λž˜μŠ€ν˜• μ»΄ν¬λ„ŒνŠΈμ˜ κΈ°λŠ₯을 λ™μΌν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλ„λ‘ 도ꡬλ₯Ό λ§Œλ“€μ–΄ μ£Όμ—ˆλŠ”λ° 이λ₯Ό Hooks(ν›…) 이라 λΆ€λ₯Έλ‹€. μ΄λŠ” ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈμ— 맞게 λ§Œλ“€μ–΄μ§„ κ²ƒμœΌλ‘œ ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈμ—μ„œλ§Œ μ‚¬μš©μ΄ κ°€λŠ₯ν•˜λ‹€.

 

Hook의 κ·œμΉ™

1. μ΅œμƒμœ„(at the Top Level)μ—μ„œλ§Œ Hook을 ν˜ΈμΆœν•΄μ•„ ν•œλ‹€.

 

반볡문, 쑰건문 ν˜Ήμ€ μ€‘μ²©λœ ν•¨μˆ˜ λ‚΄μ—μ„œ Hook을 ν˜ΈμΆœν•˜λ©΄ μ•ˆλ˜κ³  항상 React ν•¨μˆ˜μ˜ μ΅œμƒλ‹¨μ—μ„œ ν˜ΈμΆœν•΄μ•Ό ν•œλ‹€.

이 κ·œμΉ™μ„ 지킀면 μ»΄ν¬λ„ŒνŠΈκ°€ λ Œλ”λ§ 될 λ•Œλ§ˆλ‹€ 항상 λ™μΌν•œ μˆœμ„œλ‘œ Hook이 ν˜ΈμΆœλ˜λŠ” 것이 보μž₯λœλ‹€.

 

2. 였직 React ν•¨μˆ˜ λ‚΄μ—μ„œ Hook을 ν˜ΈμΆœν•΄μ•Ό ν•œλ‹€.

 

Hook은 일반적인 JavaScript ν•¨μˆ˜μ—μ„œ ν˜ΈμΆœν•˜λ©΄ μ•ˆλœλ‹€.

λŒ€μ‹  React ν•¨μˆ˜ μ»΄ν¬λ„ŒνŠΈμ—μ„œλ‚˜ Custom Hookμ—μ„œλŠ” Hook을 ν˜ΈμΆœν•  수 μžˆλ‹€.

이 κ·œμΉ™μ„ 지킀면 μ»΄ν¬λ„ŒνŠΈμ˜ λͺ¨λ“  μƒνƒœ κ΄€λ ¨ λ‘œμ§μ„ μ†ŒμŠ€μ½”λ“œμ—μ„œ λͺ…ν™•νžˆ 확인할 μˆ˜κ°€ μžˆλ‹€.

 

useState, useEffect

 

λŒ€ν‘œμ μΈ React-Hooksλ‘œλŠ” useState와 useEffectλ₯Ό λ“€ μˆ˜κ°€ μžˆλ‹€.

useStateλŠ” μƒνƒœλ₯Ό κ΄€λ¦¬ν•˜λŠ” Hook이닀.

import { useState } from 'react';

function MyComponent() {
  const [age, setAge] = useState(28);
  const [name, setName] = useState('Taylor');
  const [todos, setTodos] = useState(() => createTodos());
  // ...

μ˜ˆμ‹œμ™€ 같이 μ»΄ν¬λ„ŒνŠΈμ˜ μ΅œμƒλ‹¨μ—μ„œ useStateλ₯Ό ν˜ΈμΆœν•˜μ—¬ state λ³€μˆ˜λ₯Ό μ„ μ–Έν•œλ‹€.

ν˜„μž¬ μƒνƒœλ₯Ό λ‚˜νƒ€λ‚΄λŠ” state κ°’κ³Ό 이 μƒνƒœλ₯Ό λ³€κ²½ν•˜λŠ” setState 값을 ν•œ 쌍으둜 μ œκ³΅ν•œλ‹€.

stateλŠ” μ΄ˆκΈ°κ°’μ„ μ„€μ •ν•  수 있고 setState ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ 이 값을 λ³€κ²½ν•  μˆ˜κ°€ μžˆλ‹€.

 

useEffectλŠ” κΈ°μ‘΄ ν΄λž˜μŠ€ν˜• μ»΄ν¬λ„ŒνŠΈμ—μ„œ μ‚¬μš©ν–ˆλ˜ componentDidMount, componentDidUpdate, componentWillUnmountλ₯Ό ν•˜λ‚˜μ˜ API둜 ν†΅ν•©ν•œ 것과 κ°™λ‹€. 이 말이 무엇이냐면, React μ»΄ν¬λ„ŒνŠΈκ°€ λ Œλ”λ§λ  λ•Œλ§ˆλ‹€ νŠΉμ • μž‘μ—…μ„ μ‹€ν–‰ν•  수 μžˆλ„λ‘ ν•˜λŠ” Hookμ΄λΌλŠ” μ˜λ―Έμ΄λ‹€.

 

useEffect κΈ°λ³Έ ν˜•νƒœ:

useEffect(function, deps)

function: μˆ˜ν–‰ν•˜κ³ μž ν•˜λŠ” μž‘μ—…

deps: λ°°μ—΄ ν˜•νƒœμ΄λ©°, λ°°μ—΄μ—λŠ” κ²€μ‚¬ν•˜κ³ μž ν•˜λŠ” νŠΉμ • κ°’μ΄λ‚˜ 빈 배열이 λ“€μ–΄κ°„λ‹€.

import { useEffect } from 'react';

const Hello = () => {
    useEffect(() => {
        console.log('마운트될 λ•Œλ§Œ μ‹€ν–‰!');
    }, []);
}

export default Hello

deps에 빈 배열이 λ“€μ–΄κ°€λ©΄ 처음 λ Œλ”λ§ 될 λ•Œλ§Œ μ‹€ν–‰λ˜κ³  μ΄ν›„μ—λŠ” μ‹€ν–‰λ˜μ§€ μ•ŠλŠ”λ‹€.

λ§Œμ•½ 배열을 μƒλž΅ν•œλ‹€λ©΄ λ¦¬λ Œλ”λ§λ  λ•Œλ§ˆλ‹€ μ‹€ν–‰λœλ‹€.

만일 νŠΉμ • 값이 update 될 λ•Œλ§ˆλ‹€ μ‹€ν–‰ν•˜κ³  싢은 μž‘μ—…μ΄ μžˆλ‹€λ©΄ μ•„λž˜μ™€ 같이 μž‘μ„±ν•΄μ£Όλ©΄ λœλ‹€.

 

예λ₯Ό λ“€μ–΄, ageλΌλŠ” state 값이 λ°”λ€” λ•Œλ§ˆλ‹€ μ‹€ν–‰λ˜κ²Œ ν•˜κ³  μ‹Άλ‹€λ©΄

import { useState, useEffect } from 'react';

const Hello = () => {
    const [age, setAge] = useState(20)

    useEffect(() => {
        console.log('마운트될 λ•Œλ§Œ μ‹€ν–‰!');
    }, [age]);
}

export default Hello

 

 

[μ°Έκ³ ] 

React 곡식 λ¬Έμ„œ

https://ko.legacy.reactjs.org/docs/hooks-rules.html

728x90

λŒ“κΈ€