1. useState
2. useEffect
3. useReducer
4. useMemo
5. useCallBack
6. useRef
7. ์ปค์คํ Hooks
useEffect ใVSใuseCallBack ใVS ใuseMemo
useEffect | useCallBack | useMemo |
ํน์ ๊ฐ(๋ฐฐ์ด ์ ๊ฐ)์ด ์
๋ฐ์ดํธ ๋ ๋, ํน์ ์์ ์ ์ํํ๋๋ก ์ค์ ์๋ก์ด ํจ์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ๊ฒ์ด ์๋๋ผ, ์คํ๋๋์ง ์ฌ๋ถ์ ๊ด๋ จ |
ํน์ ๊ฐ์ด ์ ๋ฐ์ดํธ ๋ ๋, ํจ์๋ฅผ ์๋ก ์์ฑ, ํจ์ memoizationํ์ฌ, ๊ฐ์ ํจ์ ์ธ์คํด์ค ์ฌ์ฌ์ฉ โป ๋น ๋ฐฐ์ด, ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง๋ ๋ ๋ง๋ค์๋ ํจ์๋ฅผ ๊ณ์ํด์ ์ฌ์ฌ์ฉ |
ํน์ ๊ฐ์ด ์
๋ฐ์ดํธ ๋ ๋, ์ฐ์ฐ์ ์คํ(o) ์๋ก ์์ฑ(x) ๊ฐ์ memoizationํ์ฌ, ๊ณ์ฐ ๊ฒฐ๊ณผ๋ ๊ฐ์ฒด๋ฅผ ์ฌ์ฌ์ฉ ์ํ๋ ๊ฐ์ด ๋ฐ๋์ง ์์๋ค๋ฉด ์ด์ ์ฐ์ฐ ๊ฒฐ๊ณผ๋ฅผ ๋ค์ ์ฌ์ฉ (==๋ฉ๋ชจ์ด์ฆ ๋ ๊ฐ์ return) |
Hooks๋ ํจ์ ์ปดํฌ๋ํธ์์๋ ์ํ ๊ด๋ฆฌ๋ฅผ ํ ์ ์๋ ๊ธฐ๋ฅ(useState, useEffect ๋ฑ) ์ ์ ๊ณตํ๋ค.
( ํด๋์คํ ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ์ง ์๊ณ ๋ ์ํ๊ด๋ฆฌ์ ๋๋ถ๋ถ์ ๊ธฐ๋ฅ์ ๊ตฌํ)
1. useState
ํจ์ ์ปดํฌ๋ํธ์์๋ ๊ฐ๋ณ์ ์ธ ์ํ๋ฅผ ์ง๋ ์ ์๊ฒ ํด์ค๋ค.
2. useEffect
์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง๋ ๋๋ง๋ค ํน์ ์์ ์ ์ํํ๋๋ก ์ค์ ํ ์ ์๋ค.
๋น ๋ฐฐ์ด [ ] : ๋งจ ์ฒ์ ๋ ๋๋ง ๋ ๋๋ง ์คํํ๊ณ , ์ ๋ฐ์ดํธ๋ ๋๋ ์คํํ์ง ์์.
ํน์ ๊ฐ์ด ์ ๋ฐ์ดํธ ๋ ๋๋ง ์คํํ๊ณ ์ถ์๋, ๋ฐฐ์ด ์์ ๊ฒ์ฌํ๊ณ ์ถ์ ๊ฐ์ ๋ฃ์ด์ค๋ค.
useEffect(()=>{
console.log(name);
}, [name]);
3. useReducer - useReducer('reducer' , ํด๋น ๋ฆฌ๋์์ ๊ธฐ๋ณธ๊ฐ);
๋ ๋ค์ํ ์ปดํฌ๋ํธ ์ํฉ์ ๋ฐ๋ผ ๋ค์ํ ์ํ๋ฅผ ๋ค๋ฅธ ๊ฐ์ผ๋ก ์ ๋ฐ์ดํธํด ์ฃผ๊ณ ์ถ์๋ ์ฌ์ฉํ๋ค.
'reducer'๋ (ํ์ฌ ์ํ, ์ ๋ฐ์ดํธ๋ฅผ ์ํด ํ์ํ ์ ๋ณด๋ฅผ ๋ด์ action๊ฐ)์ ์ธ์๋ก ์ ๋ฌ๋ฐ์ ์๋ก์ด ์ํ๋ฅผ ๋ฐํํ๋ ํจ์์ด๋ค.
์ปดํฌ๋ํธ ์ ๋ฐ์ดํธ ๋ก์ง์ ์ปดํฌ๋ํธ ๋ฐ๊นฅ์ผ๋ก ๋นผ๋ผ ์ ์๋ค.
Nickname.js
import { useEffect, useState } from "react"; const Nickname = () => {
const [name, setName] = useState("");
const [nickname, setNickName] = useState("");
// ํน์ ๊ฐ('name')์ด ์
๋ฐ์ดํธ ๋ ๋๋ง ์คํํ๊ณ ์ถ์๋,
// useEffect์ ๋ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ๋๋ ๋ฐฐ์ด ์์ ๊ฒ์ฌํ๊ณ ์ถ์ ๊ฐ ์
๋ ฅ(['name'])
useEffect(() => {
console.log("effect");
console.log({ name, nickname });
// ์ปดํฌ๋ํธ๊ฐ ์ธ๋ง์ดํธ ๋๊ธฐ์ , ์
๋ฐ์ดํธ ๋๊ธฐ ์ง์ ์ ์ด๋ ํ ์์
์ ์ํํ๊ณ ์ถ์๋,
// ๋ท์ ๋ฆฌ ํจ์๋ฅผ "๋ฐํ(return)" ํด ์ฃผ์ด์ผ ํจ.
return () => {
console.log("cleanup");
console.log({ name, nickname });
};
}, [name]);
const changeName = (e) => {
setName(e.target.value);
};
const changeNickName = (e) => {
setNickName(e.target.value);
};
return (
<>
<input onChange={changeName} value={name} />
<input onChange={changeNickName} value={nickname} />
<p> ์ด๋ฆ {name}</p>
<p> ๋๋ค์ {nickname}</p>
</>
);
};
export default Nickname;
|
Nickname_useReducer.js import { useReducer } from "react";
// ์ปดํฌ๋ํธ ์
๋ฐ์ดํธ ๋ก์ง์ ์ปดํฌ๋ํธ ๋ฐ๊นฅ์ผ๋ก ๋นผ๋ผ ์ ์๋ค.
function reducer(state, action) {
return {
...state,
[action.name]: action.value,
};
}
const Nickname_useReducer = () => {
// useReducer ์ด Hook์ ์ฌ์ฉํ๋ฉด state๊ฐ๊ณผ dispatch ํจ์๋ฅผ ๋ฐ์์ด.
// state - ํ์ฌ ๊ฐ๋ฆฌํค๊ณ ์๋ ์ํ
// dispatch - ์ก์
์ ๋ฐ์์ํค๋ ํจ์๋ก, ํจ์ ์์ ํ๋ผ๋ฏธํฐ๋ก ์ก์
๊ฐ์ ๋ฃ์ด์ฃผ๋ฉด 'reducer'ํจ์๊ฐ ํธ์ถ
// dispathch(e.target) -> reducer(state, e.target)
const [state, dispatch] = useReducer(reducer, { name: "", nickname: "" });
const { name, nickname } = state;
const onChange = (e) => {
dispatch(e.target);
};
return (
<>
<p>useReducer</p>
<input onChange={onChange} value={name} name="name" />
<input onChange={onChange} value={nickname} name="nickname" />
<p> ์ด๋ฆ {name}</p>
<p> ๋๋ค์ {nickname}</p>
</>
);
};
export default Nickname_useReducer;
|
4. useMemo
: ํจ์ ์ปดํฌ๋ํธ ๋ด๋ถ์์ ๋ฐ์ํ๋ ์ฐ์ฐ์ ์ต์ ํํ ์ ์๋ค.
๋ ๋๋งํ๋ ๊ณผ์ ์์ ํน์ ๊ฐ์ด ๋ฐ๋์์ ๋๋ง ์ฐ์ฐ์ ์คํํ๊ณ ,
์ํ๋ ๊ฐ์ด ๋ฐ๋์ง ์์๋ค๋ฉด ์ด์ ์ฐ์ฐ ๊ฒฐ๊ณผ๋ฅผ ๋ค์ ์ฌ์ฉ
(==๋ฉ๋ชจ์ด์ฆ ๋ ๊ฐ์ return)
5. useCallBack - useCallBack(์์ฑํ๊ณ ์ถ์ ํจ์, ๋ฐฐ์ด)
โ์ด ๋ฐฐ์ด์๋ ์ด๋ค ๊ฐ์ด ๋ฐ๋์์ ๋ ํจ์๋ฅผ ์๋ก ์์ฑํด์ผ ํ๋์ง ๋ช ์,
ํจ์ ๋ด๋ถ์์ ์ํ ๊ฐ์ ์์กดํด์ผ ํ ๋๋ ๊ทธ ๊ฐ์ ๋ฐ๋์ ๋ฐฐ์ด์์ ํฌํจํด์ผํจ.
โป ๋น์ด์๋ ๋ฐฐ์ด์ ๋ฃ๊ฒ ๋๋ฉด, ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง๋ ๋ ๋ง๋ค์๋ ํจ์๋ฅผ ๊ณ์ํด์ ์ฌ์ฌ์ฉ
:useMemo์ ๋น์ท, ์ด Hook์ ์ฌ์ฉํ๋ฉด ๋ง๋ค์ด ๋จ๋ ํจ์๋ฅผ ์ฌ์ฌ์ฉํด ๋ ๋๋ง ์ฑ๋ฅ์ ์ต์ ํ ํ ์ ์๋ค.
6. useRef
: ํจ์ ์ปดํฌ๋ํธ์์ ref๋ฅผ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ํด์ค๋ค.
๋ํ ์ฑ๋ฅ์ ์๋ ์ ์๋ค.
์๋ฅผ ๋ค์ด id ๊ฐ์ ํ๋ฉด์ ๋ณด์ด์ง๋ ์๊ณ , ์ด ๊ฐ์ด ๋ฐ๋๋ค๊ณ ํด์ ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง๋ ํ์๋ ์์ต๋๋ค.
๋จ์ํ ์๋ก์ด ํญ๋ชฉ์ ๋ง๋ค๋ ์ฐธ์กฐ๋๋ ๊ฐ์ด๋ฏ๋ก ๋ ๋๋ง๋๋ ์ ๋ณด๊ฐ ์๋๋ค.
import { useCallback, useMemo, useState, useRef } from 'react';
function getAverage(numbers) {
if (numbers.length === 0) return 0;
const sum = numbers.reduce((a, b) => a + b);
return sum / numbers.length;
}
const Average = () => {
const [number, setNum] = useState(0);
const [list, setList] = useState([]);
const InputEL = useRef(null);
const onChange = useCallback((e) => {
setNum(e.target.value);
}, []);
const onInsert = useCallback(() => {
const newList = list.concat(parseInt(number));
setList(newList);
setNum('');
InputEL.current.focus();
}, [number, list]);
const avg = useMemo(() => getAverage(list), [list]);
return (
<>
<input onChange={onChange} ref={InputEL} />
<button onClick={onInsert}>๋ฑ๋ก</button>
<ul>
{list.map((e, i) => (
<li key={i}>{e}</li>
))}
</ul>
<p>ํ๊ท ๊ฐ : {avg}</p>
</>
);
};
export default Average;
7. ์ปค์คํ Hooks ๋ง๋ค๊ธฐ
์ฌ๋ฌ ์ปดํฌ๋ํธ์์ ๋น์ทํ ๊ธฐ๋ฅ์ ๊ณต์ ํ ๊ฒฝ์ฐ, ์ด๋ฅผ ์ฌ๋ฌ๋ถ๋ง์ Hook์ผ๋ก ์์ฑํ์ฌ ๋ก์ง์ ์ฌ์ฌ์ฉํ ์ ์์ต๋๋ค.