App.js
: Counter ์ปดํฌ๋ํธ์ App( )์ผ๋ก ๊ตฌ์ฑ๋ ํ์ผcounterSlice.js
: createSlice๋ก slice๋ฅผ ์์ฑํ๋ ํ์ผstore.js
: configureStore์ด ์๋ ํ์ผ index.js
: ๊ธฐ๋ณธ ํ์ผํ๋ฌ์ค ๋ฒํผ์ ๋๋ฅด๋ฉด ๊ฐ์ด๋ฐ์ ์๋ ์ซ์๊ฐ 2์ฉ ์ฆ๊ฐํ๊ณ ๋ง์ด๋์ค ๋ฒํผ์ ๋๋ฅด๋ฉด ๊ฐ์ด๋ฐ์ ์๋ ์ซ์๊ฐ 2์ฉ ๊ฐ์ํ๋ค.
import {createSlice} from "@reduxjs/toolkit";
const counterSlice= createSlice({
name: 'counter',
initialState: {value:0}, // ์ด๊ธฐ๊ฐ ์ง์
reducers: {
up: (state, action)=>{
state.value = state.value + action.payload;
},
down: (state, action)=>{
state.value = state.value + action.payload;
}
}
});
export const {up} = counterSlice.actions;
export const {down} = counterSlice.actions;
export default counterSlice;
reducers ์์ up
, down
์ก์
ํ์
์ด ์กด์ฌํ๋ค. ์ด๋ค์ ๊ธฐ๋ฅ์ ๊ฐ๊ฐ 2์ฉ ์ฆ๊ฐํ๊ฑฐ๋ ๊ฐ์ํ๋ฉด์ ๊ฐ์ด ๋ฐ๋์ด์ผ ํ๋ ๊ฒ์ด๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ state
์ value๋ฅผ ๋ฐ๊พธ๊ธฐ ์ํด์, ๋ฐ๊ณผ ๊ฐ์ ์ฝ๋๋ฅผ ์์ฑํ๋ค.
state.value = state.value + action.payload;
import {configureStore} from '@reduxjs/toolkit';
import counterSlice from "./counterSlice";
const store = configureStore({
reducer:{
couter:counterSlice.reducer
}
});
export default store;
counterSlice ์์ ์๋ up
, down
์ ๋ชจ์ ๊ฒ์ด counterSlice.reducer
์ด๋ค. counterSlice.reducer
๋ฅผ "counter์ ๋ํ reducer์ผ ~" ํ๊ณ configureStore์ reducer๋ก ์ ๋ฌํ๋ค.
export default function App(){
return (
<Provider store={store}>
</Provider>
);
}
import { Provider } from "react-redux";
๊ตฌ๋ฌธ ์ถ๊ฐimport configureStore from "./store.js"
๊ตฌ๋ฌธ ์ถ๊ฐrender
์์ Provider๋ก App์ ๊ฐ์ธ์ค๋คProvider๋ฅผ App์ ๊ฐ์ธ์ฃผ๋ฉด Store์์ ์์ฑํ State ์ํ๋ค์ ์ฑ์ ์์ ์ฐ๊ฒฐ๋์ด์๋ Component๋ค์ด ๋ฝ์์ ์ฌ์ฉํ๋ ๊ฒ์ ๊ฐ๋ฅํ๊ฒ ํด์ค๋ค.
function Counter(){
const dispatch = useDispatch();
const count = useSelector(state=>{
return state.counter.value;
});
return <div>
<button onClick= {()=>{
dispatch(up(2));
}}>+</button>
{count}
<button onClick= {()=>{
dispatch(down(-2));
}}>-</button>
</div>
}
return state.couter.value;
์์ counter์ counterSlice์ name์ด๋ค. ์ด๋ const count์ ๊ฐ์ couterSlice์ initialState์ ์ด๊ธฐ๊ฐ์ด ๋๋ค.
๐ ์๋๋ ๋ฐ๊ณผ ๊ฐ์ ์ฝ๋๋ฅผ ์์ฑํ์ง๋ง ์์ด ๋ง์ด ๊ฐ๋ค. Redux Toolkit์์๋ up, down๊ณผ ๊ฐ์ ๋ฆฌ๋์ค ํจ์๋ค์ ์ฐธ์กฐํ์ฌ ์๋์ผ๋ก ์ก์ ์ ๋ง๋ค์ด๋ธ๋ค.
<button onClick= {()=>{dispatch({type:'counter/up', stpe:2});}}>
+
</ button>
๐ค How to do?
<button onClick= {()=>{dispatch(counterSlice.actions.up(2);}}>
+
</ button>
์ด๋ ๊ฒ ์ฝ๋๋ฅผ ์์ ํ๊ณ up์ ๊ฐ์ console.log(action)์ ํ๋ฉด ์ฝ์์ payload : 2
๋ผ๊ณ ๋จ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
์ด๋ ๊ฒ ์๋์ผ๋ก ์ก์ ์ ๋ง๋ค์ด๋ด๋ ๊ฒ์ ์ ํ ํ๋ค๋ฉด, ๋ฐ๊ณผ ๊ฐ์ด ์์ ํ๊ณ
<button onClick= {()=>{dispatch(up(2);}}>
+
</ button>
์ถ๊ฐ๋ก counterSlice์์ state.value = state.value + action.payload;
๋ก ์์ ํ๋ค.
export default function App(){
return (
<Provider store={store}>
<div>
<Counter></Counter>
</div>
</Provider>
);
}