๋ฆฌ์กํธ์ ํด๋์คํ ์ปดํฌ๋ํธ์ ๋ํด ์์๋ณด์๋ค.
๊ทธ๋ฌ๋ฉด์ ์์ฐ์ค๋ Hook์ ๋ํด ์๊ฒ๋์๊ณ ,
React ์ฝ๋์ ๋๋ถ๋ถ์ Hook์ผ๋ก ์ด๋ค์ง ๊ฑธ ์๊ฒ๋์๋ค.
Hook์ด ๋ฌด์์ธ์ง, ์์ธํ๊ฒ ์์๋ณด์.
1. React Hook์ ๋ฑ์ฅ ๋ฐฐ๊ฒฝ
- ๋ฆฌ์กํธ ์ปดํฌ๋ํธ๋ ํจ์ํ ์ปดํฌ๋ํธ์ ํด๋์คํ ์ปดํฌ๋ํธ๋ก ๋๋๋ค.
- ๋ฆฌ์กํธ ์ด๊ธฐ์๋ ํจ์ํ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ์ผ๋, ๊ฐ์ ์ํ๋ฅผ ๊ด๋ฆฌ(state) ํน์ ์๋ช ์ฃผ๊ธฐ(์ปดํฌ๋ํธ๊ฐ ์์ฑ๋๊ณ ์ฌ๋ผ์ง๋ ๊ณผ์ )๋ฅผ ์ฌ์ฉํด์ผํ ๋๋ง ํด๋์คํ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋ค.
- ํด๋์คํ ์ปดํฌ๋ํธ๋ ์ฝ๋์ ๊ตฌ์ฑ์ด ์ด๋ ต๊ณ ์ฌ์ฌ์ฉ์ฑ์ด ๋จ์ด์ง๋ค. ์ฝ๋ ์ต์ ํ๋ ์ด๋ ต๊ณ ์ต์ ๊ธฐ์ ์ฌ์ฉ๋ ํจ๊ณผ์ ์ด์ง ์๋ค.
- ๊ทธ๋์ ์ด๋ฐ ํด๋์คํ ์ปดํฌ๋ํธ์ ๋จ์ ์ ๋ณด์ํ๋ฉด์, ํจ์ํ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ๋ฑ์ฅํ ๊ฒ์ด ๋ฐ๋ก React Hook(๋ฆฌ์กํธ ํ )์ด๋ค.
2. React Hook
- ๋ฆฌ์กํธ v16.8์ ์๋ก ๋์ ๋ ๊ธฐ๋ฅ์ผ๋ก ํจ์ํ ์ปดํฌ๋ํธ์์ ์ฌ์ฉ๋๋ ๋ช๊ฐ์ง ๊ธฐ์ ๋ค์ ์ผ์ปซ๋๋ค.
- ๋ฆฌ์กํธ ํ ์ ํจ์ํ ์ปดํฌ๋ํธ๊ฐ ํด๋์คํ ์ปดํฌ๋ํธ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋๋ก ํด์ค๋ค.
- ์ฃผ๋ก ๋ํ์ ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ด useEffect, useState ๋ฑ์ด ์๋ค.
3. State Hook
- State๋ฅผ ํตํด ์ปดํฌ๋ํธ๋ ์ฌ์ฉ์ ์
๋ ฅ๊ณผ ๊ฐ์ ์ ๋ณด๋ฅผ ๊ธฐ์ตํ ์ ์๋ค.
- [ useState ]
a) useState๋ ์ปดํฌ๋ํธ์ state ๋ณ์๋ฅผ ์ถ๊ฐํ ์ ์๋ค.
b) ๋ฐฐ์ด ๊ตฌ์กฐ ๋ถํด๋ฅผ ์ฌ์ฉํ์ฌ [somethig, setSomething]๊ณผ ๊ฐ์ state ๋ณ์์ ์ด๋ฆ์ ์ง์ ํด์ผํ๋ค.
c) ์๋ ์ฝ๋๋ฅผ ๋ณด๋ฉด age์ name์ด ํ์ฌ state๊ฐ ๋๋ค. ๋ง์ฝ ๋ณ๋์ฌํญ์ด ์์๋ค๋ฉด ์ด๊ธฐ๊ฐ์ด ๋ค์ด๊ฐ๋ค. ๊ทธ๋ฆฌ๊ณ setAge์ setName์ด ์ํธ์์ฉ์ ๋ฐ์ํ์ฌ ๋ค๋ฅธ ๊ฐ์ผ๋ก ๋ณ๊ฒฝํ ์ ์๋ set ํจ์๊ฐ ๋๋ค. ๊ทธ๋ฆฌ๊ณ 42์ Taylor๊ฐ ์ด๊ธฐ๊ฐ์ด ๋๋ค.
import { useState } from 'react';
function MyComponent() {
const [age, setAge] = useState(42);
const [name, setName] = useState('Taylor');
d) setName์ Robin์ ๋ฃ์๋ค. ๊ทธ๋ฌ๋ฉด ๊ทธ ๋ค์ ๋ ๋๋ถํฐ name ๊ฐ์ด 'Taylor'์์ 'Robin'์ผ๋ก ๋ฐ๋๋ค.
e) ์ฌ๊ธฐ์ ์ค์ํ ๊ฒ์ setName์ ์ฆ์ name์ ๋ณ๊ฒฝํ๋ ๊ฒ ์๋๋ผ, ๋ค์ ๋ ๋๋ฅผ ์์ฝํ๋ค.
f) ๊ทธ๋์ ๋ฐ๋ ๊ฐ์ ํ์ธํ๋ ค๋ฉด useEffect([name])์ฒ๋ผ ๋ ๋ ์ดํ ํ์ด๋ฐ์์ ํ์ธํด์ผ ํ๋ค.
useEffect(() => {
console.log("์ด์ name์:", name);
}, [name]);
- [ useReducer ]
a) useReducer๋ ์ปดํฌ๋ํธ์ reducer๋ฅผ ์ถ๊ฐํ๋ React Hook์ด๋ค.
b) ์ํ๋ฅผ ๋ฐ๊พธ๋ ๊ท์น(๋ก์ง)์ ํ ๊ณณ์ ๋ชจ์๋๊ณ ์ด๋ฒคํธ(์ก์ )๊ฐ ์ค๋ฉด ๊ทธ ๊ท์น๋๋ก ์ํ๋ฅผ ์ ๋ฐ์ดํธํ๋ค.
c) useState๋ ์ํ๋ฅผ ํ๋๋ง ๋ฐ๊ฟ ๋ ์ฐ๊ธฐ ์ข๋ค๋ฉด, useReducer์ ์ํ๊ฐ ๋ณต์กํด์ง ๋ ์ฌ์ฉํ๊ธฐ ์ข๋ค.
d) ์ฝ๋์ ์ ํ ์ค๋ช ์ ์ฝ์ด๋ณด์! ์ฝ๋ ํ๋ฆ์ ๋ค์ ์ ๋ฆฌํด๋ณด๋ฉด, ( - ) ๋ฒํผ์ ํด๋ฆญ → {type : "dec" } action ๊ฐ์ฒด ๋ฐฐ๋ฌ → ํ์ฌ๊ฐ์์ -1 ๊ณ์ฐ → state ์ํ๊ฐ ์ ๋ฐ์ดํธ ๋จ → ๋ฆฌ๋ ๋๋งํ๋ฉด์ ํ๋ฉด์ ์ซ์๊ฐ ๋ณ๊ฒฝ๋จ
import { useReducer } from "react";
const initialState = { count: 0 };
function reducer(state, action) {
// 3.
// ์ฌ๊ธฐ์ action์ด ์๊ณ , action์๋ type์ด ์๋ค.
// ์๊น ์๋ํด์ dec๋ฅผ ๋ณด๋์ผ๋ ํ์ฌ๊ฐ์์ -1์ ํ ๊ฐ์ด ๋ฆฌ๋ ๋๋ง ๋ ๊ฒ์ด๋ค.
// ๊ทธ๋ผ 0์ด ํ์ฌ ์ํ์์ผ๋ -1์ด๋ผ๋ ์๋ก์ด ๊ฐ์ด ๋ฐํ๋์ด ๋ฆฌ๋ ๋๋ง๋๋ค.
switch (action.type) {
case "inc":
return { count: state.count + 1 };
case "dec":
return { count: state.count - 1 };
case "reset":
return initialState;
default:
return state;
}
}
export default function Counter() {
// 1.
// state๋ ์ํ์ด๋ฉฐ, ์ฒซ๋ฒ์งธ ๋๋๋ง์์๋ ์ด๊ธฐ๊ฐ์ผ๋ก ์ค์ ๋๋ค.
// dispatch๋ state๋ฅผ ์๋ก์ด ๊ฐ์ผ๋ก ์
๋ฐ์ดํธํ๊ณ ๋ฆฌ๋ ๋๋งํ๋ค.
// dispatch์ ์ ์ผํ ์ธ์๋ action์ด๋ค.
// ๋งจ ์ ์ค์ ๋ณด๋ฉด initialState๋ฅผ ์ค์ ํ ์ฝ๋๊ฐ ์๋ค.
const [state, dispatch] = useReducer(reducer, initialState);
return (
<div>
// 2.
// ์๋ฅผ ๋ค์ด - ๋ฒํผ์ ํด๋ฆญํ๋ค๊ณ ๊ฐ์ ํ์.
// ๊ทธ๋ฌ๋ฉด dispatch์ action.type์ "dec"๊ฐ ๋๋ค.
// ์ด๋ {type: "dec"}๊ฐ action์ ๊ฐ์ฒด์ด๋ฉฐ ์ด ๊ฐ์ฒด ๊ทธ๋๋ก reducer ํจ์๋ก ๋๊ฒจ์ง๋ค.
<button onClick={() => dispatch({ type: "dec" })}> - </button>
<span style={{ padding: 8 }}>{state.count}</span>
<button onClick={() => dispatch({ type: "inc" })}> + </button>
<button onClick={() => dispatch({ type: "reset" })}> reset </button>
</div>
);
}
๋ด์ฅ React Hook – React
The library for web and native user interfaces
ko.react.dev
useState – React
The library for web and native user interfaces
ko.react.dev
useReducer – React
The library for web and native user interfaces
ko.react.dev