Redux
: ์ํ ๊ด๋ฆฌ์๋ก Redux๋ JS ํ๋ก์ ํธ๋ผ๋ฉด ์ด๋์๋ ์ฌ์ฉ์ด ๊ฐ๋ฅํ์ง๋ง Redux ์์ฒด๋ React ์ ๋ฌด๊ดํ๋ค.
React Redux
: Redux๋ฅผ React์ ์ฌ์ฉํ๊ธฐ์๋ ์ด๋ ค์์ด ์๋ค.
Redux Toolkit
: ์์์ ๋งํ ์ด๋ ค์์ ํด๊ฒฐํด์ฃผ๊ธฐ ์ํด Redux์์ ๋ด๋์ ํจํค์ง์ด๋ค.
Redux devtool
๊ฐ์ ํจํค์ง๋ฅผ ์ค์นํ์ง ์์๋ ๋๋ค.์ผ์ชฝ์ ์๋ ์์ด Redux์ store์ด๋ค. Redux์์๋ store ํ๋์ ๋ชจ๋ ์ ๋ณด๋ฅผ ๋ด์๋ค. ํ์ง๋ง ํ๋ก์ ํธ๊ฐ ์ปค์ง๋ฉด ํ๋์ ๋ด๊ธฐ๋ณด๋ค ๊ธฐ๋ฅ๋ณ๋ก ๋๋์ด ์ ๋ณด๋ฅผ ๋ด์์ฃผ๋ ๊ฒ์ด ์ ์ง๋ณด์์ ํจ์จ์ ์ด๋ค.
์ค๋ฅธ์ชฝ์ ์๋ ์์ ๊ฐ๊ฐ์ ๊ธฐ๋ฅ์ ๋๋์ด ๋ด์ store ์ด๋ค. ๊ฐ๊ฐ์ ๊ธฐ๋ฅ์ ํ๊ณ ์๋ slice
๋ ์์ store๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค. Redux Toolkit์ด ์์ store์ ํฉ์ณ์, Redux๊ฐ ์๊ตฌํ๋ ํฐ store๋ก ๋ง๋ค์ด์ค๋ค.
npx create-react-app ์ค์น ํด๋๋ช
--template basic-react
์ด๋ ๊ฒ ์ค์น๋ฅผ ํ๊ณ npm start๋ฅผ ํ๋๋ฐ ์ค๋ฅ 3๊ฐ๊ฐ ๋ฐ๊ฒฌ๋์๋ค.
๐จ module not found: error: can't resolve 'react-redux'
๐จ module not found error can't resolve '@reduxjs/toolkit
๐จ module not found error can't resolve '@reduxjs/toolkit
์ด ์ค์์ 2๊ฐ๋ ๊ฐ์ ์ค๋ฅ์๋ค. ์๋ง ๋ค๋ฅธ ํ์ผ์์ ๊ฐ๊ฐ ์ค๋ฅ๊ฐ ๋ํ๋ ๊ฒ ๊ฐ๋ค. ์ค๋ฅ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ๋ฃจํธ ๋๋ ํฐ๋ฆฌ์์ ํฐ๋ฏธ๋์์ ํจํค์ง๋ฅผ ์ค์นํ๊ณ ๋ค์ ์๋ฒ๋ฅผ ์์ํด์ผ ํ๋ค.
npm install redux react-redux
npm install @reduxjs/toolkit
configureStore
ํจ์๋ฅผ @reduxjs/toolki์์ ๋ถ๋ฌ์ store๋ฅผ ์์ฑํ๋ค. reducer
๋ด๋ถ์๋ slice์ reducer์ด ํฌํจ๋์ด์ผ ํ๋ค.
const store = configureStore({
reducer:{
}
});
export default store;
์์ฑํ store์ ๋ชจ๋ ์ปดํฌ๋ํธ๋ค์ด ์ฌ์ฉํ ์ ์๋๋ก ์์ฑ์ด store์ธ <Provider>
์ปดํฌ๋ํธ๋ฅผ ๋ถ๋ฌ์์ <Counter>
์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ผ๋ค. <Provider>
๋ถ๋ถ์ index.js์ ์ถ๊ฐํด์ค๋ ๋์ง๋ง ์ฌ๊ธฐ์๋ App.js์ ๋ฃ์๋ค.
export default function App(){
return (
<Provider store={store}>
</Provider>
);
}
slice๋ ์์ store๋ผ๊ณ ํ ์ ์์ผ๋ฉฐ, slice๋ค์ด ๋ชจ์ฌ์ ํ๋์ ํฐ store๊ฐ ๋๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค. Redux
์์๋ if, switch๋ฌธ์ ์ฌ์ฉํ์ฌ ์ก์
์ ๋์์ ๋ํ๋์ง๋ง Redux Toolkit
์์๋ object ํ์์ผ๋ก ์์ฑํ๋ค.
const counterSlice= createSlice({
name: 'counter',
initialState: {value:0}, // ์ด๊ธฐ๊ฐ ์ง์
reducers: { // ์ก์
ํ์
up: (state, action)=>{
state.value = state.value + action.payload;
}
}
});
export default counterSlice;
// dispatchํ ๋ ์ก์
์ ์ ๋ฌํ์ฌ ์ํ๋ฅผ ์ด๋ป๊ฒ ๋ณํ์ํฌ์ง๋ฅผ ๊ฒฐ์
export const {up} = counterSlice.actions;
์ด๋ ๊ฒ createSlice
์๋ ์ธ๊ฐ์ ๊ฐ์ฒด๋ฅผ ๋ฐ์์จ๋ค.
1. name, 2. initialState, 3.reducers
์ด๋ค์ ์ฌ์ฉํ ์ ์๋๋ก configureStore
์ ๋ฑ๋กํด์ฃผ์ด์ผ ํ๋ค.
์ฌ๊ธฐ์ ๋ฑ๋ก์ด๋ ์ด ๊ธ์ 4. store์ slice ์ถ๊ฐ
์ ๊ณผ์ ์ ๋งํ๋ค.
์์ฑํ slice๋ฅผ store์ reducer์ ์ถ๊ฐํด์ค๋ค.
const store = configureStore({
reducer:{
couter:counterSlice.reducer
}
});
export default store;
์ฌ๊ธฐ์ counter ๋ถ๋ถ์ ๋ง์๋๋ก ์๋ช
ํด๋ ๋์ง๋ง, counterSlice์ name
์ด๋ ๋๊ฐ์ด ๋ง์ถฐ์ฃผ์๋ค.
import React from "react";
import {Provider,useSelector,useDispatch} from 'react-redux';
import store from './store';
import {up} from './counterSlice';
function Counter(){
const dispatch = useDispatch();
const count = useSelector(state=>{
return state.couter.value;
});
return <div>
<button onClick= {()=>{ dispatch(up(2));}}>
+
</button>{count}
</div>
}
useSelector๋ ๋งค๊ฐ๋ณ์๊ฐ state์ธ ์ฝ๋ฐฑํจ์๋ฅผ ํ๋ ๋ฐ์์ค๋ค. ์ด๋ state๋ counterSlice ์์ ์๋ ๊ฐ์ฒด๋ฅผ ๋ฐ์์จ๋ค.
import React from "react";
import {Provider,useSelector,useDispatch} from 'react-redux';
import store from './store';
import {up} from './counterSlice';
export default function App(){
return (
<Provider store={store}>
<div>
<Counter></Counter>
</div>
</Provider>
);
}