ํ ์ ํฌ๊ธฐ๋ก ์๋ผ ๋จน๋ ๋ฆฌ์กํธ ์น์ 10 - useReducer
์ปดํฌ๋ํธ ๋ด๋ถ์ ์๋ก์ด State๋ฅผ ์์ฑํ๋ React Hook์ด๋ค.
๋ชจ๋ useState๋ useReducer๋ก ๋์ฒด ๊ฐ๋ฅํ๋ค.
์ํ ๊ด๋ฆฌ ์ฝ๋๋ฅผ ์ปดํฌ๋ํธ ์ธ๋ถ๋ก ๋ถ๋ฆฌํ ์ ์๋ค๋ ์ฐจ์ด์ ์ด ์๋ค.
function App() {
const [todos, setTodos] = useState(mockData);
const idRef = useRef(3);
const onCreate = (content) => {
const newTodo = {
id: idRef.current++,
isDone: false,
content: content,
date: new Date().getTime(),
};
setTodos([newTodo, ...todos]);
};
์ปดํฌ๋ํธ ๋ด๋ถ์ ์ํ ๊ด๋ฆฌ ์ฝ๋๋ฅผ ์์ฑํ ๊ฒ
function reducer() {
//...
}
function App() {
const [todos, dispatch] = useReducer(reducer);
//...
}
useReducer๋ฅผ ์ฌ์ฉํ๋ฉด, ์ปดํฌ๋ํธ ์ธ๋ถ์ ์ํ ๊ด๋ฆฌ ์ฝ๋๋ฅผ ๋ถ๋ฆฌํ์ฌ ์์ฑํ ์ ์๋ค.
import { useReducer } from "react";
function reducer(state, action) {
switch (action.tye) {
case "INCREASE":
return state + action.data;
case "Decrease":
return state - action.data;
default:
return state;
}
}
const Exam = () => {
const [state, dispatch] = useReducer(reducer, 0);
const onClickPlus = () => {
dispatch({
type: "INCREASE",
data: 1,
});
};
const onClickMinus = () => {
dispatch({
type: "DECREASE",
data: 1,
});
};
return (
<div>
<h1>{state}</h1>
<button>onClick={onClickPlus}</button>
<button onClick={onClickMinus}>-</button>
</div>
);
};
export default Exam;
Exam.jsx์ ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ฅผ ์์ฑํด๋ณด์๋ค.
dispatch๋? ์ํ ๋ณํ๊ฐ ์์ด์ผ ํ๋ค๋ ์ฌ์ค์ ์๋ฆฌ๊ณ ๋ฐ์กํ๋ ํจ์์ด๋ค.
import "./App.css";
import { useState, useRef, useReducer } from "react";
import Header from "./components/Header";
import Editor from "./components/Editor";
import List from "./components/List";
const mockData = [
{
id: 0,
isDone: false,
content: "React ๊ณต๋ถํ๊ธฐ",
date: new Date().getTime(),
},
{
id: 1,
isDone: false,
content: "์ฝ์ดํ์ ๊ฐ๊ธฐ",
date: new Date().getTime(),
},
{
id: 2,
isDone: false,
content: "์ผ์ฐ ์ผ์ด๋๊ธฐ",
date: new Date().getTime(),
},
];
function reducer(state, action) {
switch (action.type) {
case "CREATE":
return [action.data, ...state];
case "UPDATE":
return state.map((item) =>
item.id === action.targetId ? { ...item, isDone: !item.isDone } : item
);
case "DELETE":
return PopStateEvent.filter((item) => item.id !== action.targetId);
default:
return state;
}
}
function App() {
const [todos, dispatch] = useReducer(reducer, mockData);
const idRef = useRef(3);
const onCreate = (content) => {
dispatch({
type: "CREATE",
data: {
id: idRef.current++,
isDone: false,
content: content,
date: new Date().getTime(),
},
});
};
const onUpdate = (targetId) => {
dispatch({
type: "UPDATE",
targetId: targetId,
});
};
const onDelete = (targetId) => {
dispatch({
type: "DELETE",
targetId: targetId,
});
};
return (
<div className="App">
<Header />
<Editor onCreate={onCreate} />
<List todos={todos} onUpdate={onUpdate} onDelete={onDelete} />
</div>
);
}
export default App;
๊ธฐ์กด ์ฝ๋์
Exam.jsx๋ฅผ ๋ง๋ค์ด ์ฝ๋๋ฅผ ์ถ๊ฐํด๋ณด๋ฉด useReducer๋ฅผ ์ฌ์ฉํด์ ๊ตฌํํ ์ ์๋ค.
