| ์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 | 31 |
- ๊ตฌ๊ธํฐํธ
- ๋ชจ๋์นํฐํธ
- inlineblock
- ๋นํ๊ทธ
- borderspacing
- selectorslevel4
- formtag
- texttransform
- ์ฃผ์
- ํผํ๊ทธ
- textshadow
- ์ ๋๋ฒ์ ์ ๋ ํฐ
- CDN
- textdecoration
- liststyleimage
- captionside
- wordspacing
- ํฐํธ์จ์ดํธ
- ์ถ์ฝ
- ํ์ ์ ๋ ํฐ
- ํด๋์ค์ ๋ ํฐ
- fontweight
- ๊ทธ๋ฃน์ ๋ ํฐ
- borderstyle
- ํฅ์ค์ฝ๋
- ์์ด๋์ ๋ ํฐ
- liststyleposition
- gtammertable
- liststyletype
- bordercollapse
- Today
- Total
็ก์
useReducer (์ ์ฆ๋ฆฌ๋์) ๋ณธ๋ฌธ
๐ก useReducer
๋ณต์กํ ์ํ๋ฅผ ์ฒด๊ณ์ ์ผ๋ก ๊ด๋ฆฌํ๊ธฐ ์ํ React Hook.
useState๋ ๊ฐ๋จํ ์ํ๋ฅผ ๊ด๋ฆฌํ ๋ ์ฌ์ฉํ๋ฉฐ, ์ฌ๋ฌ ์ํ๊ฐ ์๋ก ์ฐ๊ด๋๊ฑฐ๋ ์ํ ๋ณ๊ฒฝ ๋ก์ง์ด ๋ณต์กํ ๊ฒฝ์ฐ์๋ useReducer๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
โผ๏ธ ํ์ ์ด์
useState๋ ๊ฐ๋จํ ์ํ ๊ด๋ฆฌ์๋ ์ ํฉํ์ง๋ง ๋ค์๊ณผ ๊ฐ์ ์ํฉ์์๋ ์ฝ๋๊ฐ ๋ณต์กํด์ง ์ ์๋ค.
1๏ธโฃ ์ฌ๋ฌ ์ํ๊ฐ ์๋ก ์ฐ๊ด๋ ๊ฒฝ์ฐ
์ฌ๋ฌ ๊ฐ์ ์ํ๊ฐ ํจ๊ป ๋ณ๊ฒฝ๋์ด์ผ ํ๋ค๋ฉด useState๋ฅผ ์ฌ๋ฌ ๋ฒ ์ฌ์ฉํด์ผ ํ๋ค.
const [title, setTitle] = useState("");
const [content, setContent] = useState("");
const [author, setAuthor] = useState("");
- ์ํ๊ฐ ๋ง์์ง์๋ก ๊ด๋ฆฌํ๊ธฐ ์ด๋ ค์์ง๋ค.
2๏ธโฃ ์ํ ๋ณ๊ฒฝ ๋ก์ง์ด ๋ณต์กํ ๊ฒฝ์ฐ
์กฐ๊ฑด์ ๋ฐ๋ผ ์ฌ๋ฌ ์ํ๋ฅผ ํจ๊ป ๋ณ๊ฒฝํ๊ฑฐ๋, ์ํ ๋ณ๊ฒฝ ๋ก์ง์ด ๋ง์์ง์๋ก ์ปดํฌ๋ํธ ๋ด๋ถ ์ฝ๋๊ฐ ๋ณต์กํด์ง๋ค.
๐ useReducer๋ ์ด๋ฌํ ์ํ ๋ณ๊ฒฝ ๋ก์ง์ ๋ณ๋์ ํจ์๋ก ๋ถ๋ฆฌํ์ฌ ๊ด๋ฆฌํ ์ ์๋ค.
โผ๏ธ ์ฃผ์ ํน์ง
- ๋ณต์กํ ์ํ ๋ก์ง
- ์ฌ๋ฌ ํ์ ๊ฐ์ผ๋ก ๊ตฌ์ฑ๋ ๋ณต์กํ ์ํ๋ฅผ ๊ด๋ฆฌํด์ผ ํ ๋ ์ ์ฉํ๋ค.
- ์๋ก ๊ด๋ จ๋ ์ํ
- ํ ์ํ์ ๋ณ๊ฒฝ์ด ๋ค๋ฅธ ์ํ์ ์ํฅ์ ๋ฏธ์น๊ฑฐ๋, ์ฌ๋ฌ ์ํ๊ฐ ๋์์ ๋ณ๊ฒฝ๋์ด์ผ ํ ๋ ์ฌ์ฉํ๋ค.
- ์ํ ๋ก์ง ๋ถ๋ฆฌ
- ์ํ ์ ๋ฐ์ดํธ ๋ก์ง์ ์ปดํฌ๋ํธ ๋ฐ์ผ๋ก ๋ถ๋ฆฌํ์ฌ ์ฝ๋๋ฅผ ๊น๋ํ๊ฒ ๊ด๋ฆฌํ ์ ์๋ค.
- ์ฌ์ฌ์ฉ์ฑ
- ๋์ผํ ์ํ ๊ด๋ฆฌ ๋ก์ง์ ์ฌ๋ฌ ์ปดํฌ๋ํธ์์ ์ฌ์ฌ์ฉํ ์ ์๋ค.
โผ๏ธ ํต์ฌ ๊ฐ๋
๐น reducer
์ํ๋ฅผ ์ด๋ป๊ฒ ๋ณ๊ฒฝํ ์ง ์ ์ํ๋ ํจ์.
ํ์ฌ ์ํ(state)์ ์ก์ (action)์ ๋ฐ์ ์๋ก์ด ์ํ๋ฅผ ๋ฐํํ๋ค.
function reducer(state, action) {
switch (action.type) {
case "INCREMENT":
return { count: state.count + 1 };
default:
return state;
}
}
๐น State
ํ์ฌ ์ํ๋ฅผ ์๋ฏธํ๋ค.
state.count
๐น action
์ด๋ค ์ํ ๋ณ๊ฒฝ์ ํ ๊ฒ์ธ์ง ๋ํ๋ด๋ ๊ฐ์ฒด์ด๋ค.
์ผ๋ฐ์ ์ผ๋ก type ์์ฑ์ ์ฌ์ฉํ๋ค.
{
type: "INCREMENT"
}
- ํ์ํ ๊ฒฝ์ฐ ๋ฐ์ดํฐ๋ฅผ ํจ๊ป ์ ๋ฌํ ์๋ ์๋ค.
{
type: "ADD",
payload: 10
}
๐น dispatch
Reducer์๊ฒ Action์ ์ ๋ฌํ๋ ํจ์์ด๋ค.
dispatch({ type: "INCREMENT" });
โผ๏ธ ๊ธฐ๋ณธ ์ฌ์ฉ ๋ฐฉ๋ฒ
useReducer๋ state์ dispatch๋ฅผ ๋ฐํํ๋ฉฐ, reducer ํจ์์ ์ด๊ธฐ ์ํ(initialState)๋ฅผ ์ธ์๋ก ๋ฐ๋๋ค.
1๏ธโฃ Reducer ํจ์ ์์ฑ → 2๏ธโฃ useReducer ์ฌ์ฉ → 3๏ธโฃ dispatch๋ก ์ํ ๋ณ๊ฒฝ
import React, { useReducer } from 'react';
// 1. Reducer ํจ์ ์ ์
// ์ด ํจ์๋ '์ํ๋ฅผ ์ด๋ป๊ฒ ๋ฐ๊ฟ์ง' ์ ์ํฉ๋๋ค.
// currentState: ํ์ฌ ์ํ
// action: ์ด๋ค ์ผ์ด ๋ฐ์ํ๋์ง (๊ฐ์ฒด ํํ, ์ฃผ๋ก type ์์ฑ ํฌํจ)
function reducer(currentState, action) {
switch (action.type) {
case 'INCREMENT': // 'INCREMENT' ์ก์
์ด ์ค๋ฉด
return { count: currentState.count + 1 }; // count๋ฅผ 1 ์ฆ๊ฐ์ํจ ์ ์ํ ๋ฐํ
case 'DECREMENT': // 'DECREMENT' ์ก์
์ด ์ค๋ฉด
return { count: currentState.count - 1 }; // count๋ฅผ 1 ๊ฐ์์ํจ ์ ์ํ ๋ฐํ
case 'RESET': // 'RESET' ์ก์
์ด ์ค๋ฉด
return { count: 0 }; // count๋ฅผ 0์ผ๋ก ์ด๊ธฐํํ ์ ์ํ ๋ฐํ
default:
return currentState; // ์ ์ ์๋ ์ก์
์ ์๋ฌ ๋ฐ์
}
}
// 2. ์ปดํฌ๋ํธ์์ useReducer ์ฌ์ฉ
function Counter() {
// useReducer(reducer ํจ์, ์ด๊ธฐ ์ํ)
// useReducer๋ [ํ์ฌ ์ํ, dispatch ํจ์]๋ฅผ ๋ฐํ
const [state, dispatch] = useReducer(reducer, { count: 0 });
return (
<div>
<p>ํ์ฌ ์นด์ดํธ: {state.count}</p>
{/* 3. dispatch ํจ์๋ฅผ ํธ์ถํ์ฌ ์ก์
์ ๋ฌ */}
<button onClick={() => dispatch({ type: 'INCREMENT' })}>์ฆ๊ฐ</button>
<button onClick={() => dispatch({ type: 'DECREMENT' })}>๊ฐ์</button>
<button onClick={() => dispatch({ type: 'RESET' })}>์ด๊ธฐํ</button>
</div>
);
}
export default Counter;
๐ useState vs useReducer ๐
| useState | useReducer |
| ๊ฐ๋จํ ์ํ ๊ด๋ฆฌ | ๋ณต์กํ ์ํ ๊ด๋ฆฌ |
| ์ํ ๋ณ๊ฒฝ ๋ก์ง์ด ๋จ์ํจ | ์ํ ๋ณ๊ฒฝ ๋ก์ง์ ๋ถ๋ฆฌํ์ฌ ๊ด๋ฆฌ |
| ์์ ํ๋ก์ ํธ์ ์ ํฉ | ์ฌ๋ฌ ์ํ๋ฅผ ํจ๊ป ๊ด๋ฆฌํ ๋ ์ ํฉ |
| ์ฌ์ฉ ๋ฐฉ๋ฒ์ด ๊ฐ๋จํจ | reducer์ dispatch๋ฅผ ์ฌ์ฉ |
'<React>' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| Context API (์ฝํ ์คํธ ์์ดํผ์์ด) (0) | 2026.07.15 |
|---|---|
| Styled component (์คํ์ผ๋ ์ปดํฌ๋ํธ) (0) | 2026.07.15 |
| React Router (react-router-dom) (0) | 2026.07.14 |
| React์์ map ํจ์ ์ฌ์ฉํ๊ธฐ (0) | 2026.07.14 |
| Hash URL (0) | 2026.07.14 |
