๐ต๐ปโ๏ธ ๋ฆฌ๋์ค๋ฅผ ์ฌ์ฉํ๋ ์ด์
- ๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ฆ์ ํ์
- ์๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ฆ์ ํ ๊ฐ์ ๋ชจ๋ธ์ด ์ฌ๋ฌ ๋ทฐ๋ฅผ ์กฐ์ํ๊ฑฐ๋, ํ ๊ฐ์ ๋ทฐ๊ฐ ์ฌ๋ฌ ๋ชจ๋ธ์ ์กฐ์ํ ์ ์๋ค. ์ด๋ ๋ฐ์ดํฐ ํ๋ฆ์ ์ดํดํ๊ณ ๋ฒ๊ทธ๋ฅผ ์ฐพ๋ ๊ฒ์ ๋ฐฉํดํ๋ค. ์ด์ ๊ฐ์ ์ด์ ๋ก ๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ฆ์ด ํ์ํ๋ค.
- ๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ฆ(= redux๊ฐ ์๋ํ๋ ๋ฐฉ์)์ ๋ฐ์ดํฐ๊ฐ ํ๋ฐฉํฅ์ผ๋ก๋ง ํ๋ฅด๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ ํ๋ฆ์ ์์ธกํ๊ธฐ ์ฝ๋ค.
- ํธ๋ฆฌํ state ๊ด๋ฆฌ
- redux๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉด react ์ปดํฌ๋ํธ ๋ค์ ๊ฐ๊ฐ ๊ฐ๋ณ์ ์ผ๋ก state๋ฅผ ๊ด๋ฆฌํฉ๋ค.
- redux๋ฅผ ์ฌ์ฉํ๋ฉด state๋ฅผ ๊ด๋ฆฌํ๋ ์ ์ฉ ์ฅ์(store)์์ ์ํ๋ฅผ ๊ด๋ฆฌํ๊ณ ์ปดํฌ๋ํธ๋ ๊ทธ๊ฑธ ๋ณด์ฌ์ฃผ๊ธฐ๋ง ํ๋ ์ฉ๋๋ก ์ฐ์ธ๋ค.
๐ต๐ปโ๏ธ redux์ ์ฉ ๋ฐ ๊ฐ๋
โ ํ์ํ ํจ์บ์ง ์ค์น
npm install redux
npm install react-redux
โ action
์ก์ ์ ๋ฌด์จ์ผ์ด ์ผ์ด๋ฌ๋์ง ์ค๋ช ํด์ฃผ๋ ๊ฐ์ฒด์ด๋ค. ์๋ฅผ ๋ค์ด user๋ผ๋ state๋ฅผ ์์ ํด ์ฃผ๋ ์ญํ ์ ํ๋ ์ก์ ์ SET_USER์ ๊ฐ์ด ์ ์ธํ๊ณ , setUser(user)๋ผ๋ ํจ์ํํ์ action creator์ ๋ง๋ค์ด ์ฃผ๋ฉด ๋๋ค.
์ก์ ์ ์ธ (๋๋ถ๋ถ ๋๋ฌธ์๋ก ์ ์ธ)
const SET_WINNER = 'SET_WINNER';
const CLICK_CELL = 'CLICK_CELL';
const CHANGE_TURN = 'CHANGE_TURN';
์ก์ ์ ๋ฐํํ๋ action creators(์ก์ ์์ฑ ํจ์)
export const setWinner(user) {
return {type: SET_WINNER, user}
}
โ reducer
- reducer๋ state์ action์ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์์์ state๋ฅผ ๋ณ๊ฒฝํ๋ ํจ์์ด๋ค.
- action์๋ ์ก์ ์์ฑ ํจ์์์ ๋ฐํํ๋ ๊ฐ์ฒด๊ฐ ๋ค์ด๊ฐ๋ค.
- return ์์ ๋ค๋ฅธ state๊ฐ์ ๋ณ๊ฒฝ๋์ง ์๊ฒ ํ๊ธฐ ์ํด ์ ๊ฐ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ค.
- reducer๋ฅผ ์์ฑํ ๋ switch ๋ฌธ์ ์์ฃผ ์ฌ์ฉํ๋ค.
const reducer = (state = initState, action) => {
switch (action.type) {
case Action์ด๋ฆ:
return {
...state,
๋ฐ๊ฟ state: ์ง์ ๊ฐ
}
}
}
- ๊ฐ ์ปดํฌ๋ํธ ๋ณ๋ก ๋ฆฌ๋์๋ฅผ ์์ฑํ๋ค๋ฉด ์ด๋ฅผ ํตํฉํด์ผ ํ๋ค. ์ด๋ combineReducers()๋ฅผ ์ฌ์ฉํ๋ค.
import { combineReducers } from 'redux';
import memberDetail from './memberDetail';
import member from './member';
export default combineReducers({
memberDetail,
member,
});
โ store
- ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๋ ๊ฐ์ ๊ณต๊ฐ์ด๋ค.
- combineReducers()๋ฅผ ํตํด ํตํฉ๋ reducer์ initState(state ์ด๊ธฐ๊ฐ)๋ฅผ ์ค๋นํ๋ค.
import { createStore } from 'redux';
const store = createStore(rootReducer);
- store์ ์ ์ฉํ๊ธฐ ์ํด์ 'index.js'๋ฅผ ์๋์ ๊ฐ์ด ์์ ํด ์ฃผ์ด์ผํ๋ค.
- store ์ต์ ์ ์ค์ ํ <Provider> ํ๊ทธ๋ก App component๋ฅผ ๊ฐ์ธ์ค๋ค.
import { Provider } from 'react-redux';
import { createStore } from 'redux';
import rootReducer from './store/modules';
const store = createStore(rootReducer);
ReactDOM.render(
<React.StrictMode>
<Provider store={store}>
<App />
</Provider>
</React.StrictMode>,
document.getElementById('root')
);
reportWebVitals()
โ dispatch
dispatch๋ก action์ ๋ฐ์์ํจ๋ค.
import { setMembersToStore } from '../../store/modules/member';
import { useDispatch } from 'react-redux';
const dispatch = useDispatch();
const saveMembersToStore = data => dispatch(setMembersToStore(data));
...
saveMembersToStore(member);
< useDispatch์ ๋ํ ์ค๋ช ์ ์๋ ๋งํฌ๋ฅผ ์ฐธ๊ณ ! >
๐ผ ์ ์ฒด ์ ์ฉ ์์ github
๋ฐ์ํ
'react > redux' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[React] redux-saga ์์ํ๊ธฐ! ๊ธฐ๋ณธ์ ์ธ effects ํ์ฉ (0) | 2021.03.31 |
---|---|
[React] redux-actions๋ก ๊ฐ๋ ์ฑ ๋์ด๊ธฐ (0) | 2021.03.31 |
[React] useSelector, useDispatch๋ก state์ ์ ๊ทผํ๊ธฐ (0) | 2021.03.31 |