์ํ๊ด๋ฆฌ๋ฅผ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค.
react๋ props ํํ๋ก ์ปดํฌ๋ํธ ๊ฐ ์ํ๋ฅผ ๊ณต์ ํฉ๋๋ค. ํ์ง๋ง ์์ ์ปดํฌ๋ํธ๋ผ๋ฆฌ๋ ์ํ ๊ณต์ ๊ฐ ๋ถ๊ฐ๋ฅํ๊ณ , ์ปดํฌ๋ํธ๊ฐ ๋ง์์ง ๊ฒฝ์ฐ ์ฌ๋ฌ ์ปดํฌ๋ํธ๋ฅผ ๊ฑฐ์ณ props๊ฐ ์ ๋ฌ๋๋ props drilling์ด ๋ฐ์ํ๊ธฐ๋ ํฉ๋๋ค.
ํ๋ก์ ํธ์ ๊ท๋ชจ๊ฐ ์ปค์ง์๋ก ์ํ๊ด๋ฆฌ๋ ๋ ์ด๋ ค์์ง๋๋ฐ, ์ด๋ฌํ ๋ฌธ์ ์ ์ ํด๊ฒฐํ๊ณ ์ ์ ์ญ์ ์ผ๋ก ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ์ํ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
Redux toolkit์ Redux์ ์์ ์ ๋จ์ํํ์ฌ ๊ธฐ์กด์ ๋ณต์กํ ์ฌ์ฉ ๋ฐฉ์๊ณผ ๋น๋ํ ๋ณด์ผ๋ฌ ํ๋ ์ดํธ ๋ฌธ์ ๋ฑ์ ํด๊ฒฐํ ์ํ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค.
import { configureStore } from '@reduxjs/toolkit'
export default configureStore({
reducer: { }
})
redux toolkit์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ store.js ํ์ผ์ ์์ฑํ์ฌ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ store๋ฅผ ๋ง๋ญ๋๋ค.
import { Provider } from "react-redux";
import App from "./App";
import { store } from './store';
const Homework = () => {
return (
<>
<Provider store={store}>
<App />
</Provider>
</>
);
};
export default Homework;
์ ์ญ์์ ์ํ๋ฅผ ๊ณต์ ํ๊ธฐ ์ํด App์ Provider๋ก ๊ฐ์๋๋ค.
const initialState: initialState = {
todos: [{id: 1, title: 'ํ ์ผ'}]
}
const todosSlice = createSlice({
name: 'todos',
initialState,
reducers: {
}
})
export const store = configureStore({
reducer: {
getTodos: todosSlice.reducer
}
})
createSlice()๋ slice๋ฅผ ๋ง๋๋ ์ญํ ์ ํฉ๋๋ค. name์ slice๋ฅผ ์์ฑํ ๋ ๋ด๋ถ์ ์ผ๋ก ์ค๋ณต์ ํผํ๊ธฐ ์ํด์ ์ฌ์ฉํ๋ ์ด๋ฆ, initialState๋ ์ด๊ธฐ ์ํ๊ฐ, reducer๋ ์ํ ๋ณํ๋ฅผ ์ฒ๋ฆฌํ๋ ํจ์์ ๋๋ค.
configureStore()์๋ slice ๋ฑ๋กํด ์ ์ญ์์ ์ํ๊ด๋ฆฌ๋ฅผ ํ ์ ์์ต๋๋ค.
const todos = useSelector((state: ReturnType<typeof store.getState>) => state.getTodos.todos)
์ปดํฌ๋ํธ์์ useSelector๋ฅผ ์ฌ์ฉํด store์ ์๋ slice๋ฅผ ํธ์ถํด ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค.
const todosSlice = createSlice({
name: 'todos',
initialState,
reducers: {
addTodo: (state, action: PayloadAction<string>) => {
state.todos = [
{id: Date.now() , title: action.payload},
...state.todos
]
},
deleteTodo: (state, action: PayloadAction<number>) => {
state.todos
= state.todos.filter(todo => todo.id !== action.payload)
}
}
})
export const {addTodo, deleteTodo} = todosSlice.actions
reducer๋ ์ํ์ ๋ณ๊ฒฝ ์ฌํญ์ ๊ฒฐ์ ํ๊ณ ์ ๋ฐ์ดํธ ๋ ์ํ๋ฅผ ๋ฐํํ๋ ํจ์์ ๋๋ค. reducer๋ฅผ ํตํด store์ ๋ด๋ถ ์ํ๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค.
todoSlice์ reducer์ todo๋ฅผ ์ถ๊ฐํ๋ addTodo ํจ์์, ์ญ์ ํ๋ deleteTodo ํจ์๋ฅผ ๋ง๋ค์์ต๋๋ค.
reducer๋ฅผ ์ ์ญ์์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ slice์ ์ด๋ฆ๋ค์ .actions๋ฅผ ๋ถ์ฌ export ํฉ๋๋ค.
const dispatch = useDispatch()
const handleSubmit = (event: React.FormEvent<HTMLFormElement>) => {
event.preventDefault()
dispatch(addTodo(input))
setInput('')
}
์ํ๋ณ๊ฒฝ์ ์ํ๋ ์ปดํฌ๋ํธ์์ useDispatch๋ฅผ ์ฌ์ฉํด Action์ ์ ๋ฌํ๋ฉด
์ง์ ! todo๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์ถ๊ฐ๋๊ณ ์ญ์ ๋๋ค์ ใ ใ