redux๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๋ฆฌ์กํธ์์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ค.
useState
๋ฅผ ์ฌ์ฉํ์ฌ ์ํ๋ฅผ ๊ด๋ฆฌํ ๊ฒฝ์ฐ ๋ฃจํธ ์ปดํฌ๋ํธ์์ ์ข
์ ์ปดํฌ๋ํธ๋ก props๋ฅผ ์ ๋ฌํ๊ฒ ๋๋ค. ์ด ๋ฐฉ์์ ์ปดํฌ๋ํธ์ ๊ตฌ์กฐ๊ฐ ๊ฐ๋จํ๋ค๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์๋๋ค.
ํ์ง๋ง ํ๋ก์ ํธ์ ๊ท๋ชจ๊ฐ ์ปค์ง๊ฑฐ๋ ๋ณต์กํด์ ธ์ ๊ทธ ํ์์ ํ์์ ํ์ ์ปดํฌ๋ํธ๋ก state๋ฅผ ์ ๋ฌํด์ผ ํ๋ค๋ฉด, props๋ฅผ ๊ณ์ ๋ด๋ ค์ค์ผ ํ๊ณ ์ ๋ฌ๋ฐ์ props๊ฐ ์ด๋ ์ปดํฌ๋ํธ์์ ์จ ๊ฒ์ธ์ง ์๊ธฐ ํ๋ค์ด์ง๋ค. ์ฌ์ง์ด ํด๋น state๊ฐ ํ์ ์๋ ์ปดํฌ๋ํธ์์๋ ํ์ ์ปดํฌ๋ํธ๋ก ์ ๋ฌํด์ฃผ๊ธฐ ์ํด props๋ฅผ ๋ฐ๋ ์ํฉ์ด ๋ฐ์ํ ์๋ ์๋ค.
์ด๋ฌํ ์ข ์์ฑ์ ํํผํ๊ธฐ ์ํด ํ๋ก์ ํธ ๋ฃจํธ๋ ๋ฒจ์์ state๋ฅผ ๊ด๋ฆฌํด์ฃผ๋ ๊ฒ์ด ๋ฆฌ๋์ค์ด๋ค.
store์ state๋ฅผ ์ ์ฅํ๊ณ ํ์ํ ์ปดํฌ๋ํธ์์ state์ state๋ฅผ ๋ฐ๊พธ๋ ํจ์๋ฅผ ์ ๋ฌ๋ฐ๋๋ค.
๋ฆฌ๋์ค๋ฅผ ์ฌ์ฉํ๊ธฐ ์ , ์์์ผ ํ ๊ฐ๋ ์ด ๋ช ๊ฐ์ง ๋ฑ์ฅํ๋ค.
์ก์
์ํ์ ๋ณํ๊ฐ ์๊ธธ ๋ ๋ฐ์ํ๋ฉฐ ํ๋์ ๊ฐ์ฒด๋ก ํํ๋๋ค.
์ก์ ๊ฐ์ฒด๋ ์ฌ๋ฌ ์์ฑ์ ๊ฐ์ง ์ ์๊ณ , ๊ฐ๊ฐ์ ์ก์ ์ ๊ตฌ๋ถํ ์ ์๊ฒ type ์์ฑ์ ๋ฐ๋์ ๊ฐ๊ณ ์์ด์ผ ํ๋ค.
๋๋จธ์ง ์์ฑ๋ค์ ์์ฑ์๊ฐ ํ์ํ ์ํ๋ฅผ ๋ง์๋๋ก ์์ฑํ๋ฉด ๋๋ค.
//modules/survey.js
//์ก์
ํ์
์ ์
const SURVEY_INIT = 'survey/INIT';
const SURVEY_INSERT = 'survey/INSERT';
//์ก์
์์ฑ ํจ์
export const surveyInit = () => ({
type: SURVEY_INIT,
});
export const surveyInsert = (surveyResult) => ({
type: SURVEY_INSERT,
surveyResult,
});
๋ฆฌ๋์
๋ฆฌ๋์๋ ์ก์ ์ด ๋ฐ์ํ์ ๋, ์ํ ๋ณํ๋ฅผ ์ผ์ผ์ผ์ฃผ๋ ํจ์์ด๋ค. ์ก์ ๊ฐ์ฒด๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์์์ ํด๋น ์ก์ ์ ๋ง๋ ํจ์๋ฅผ ์คํ์์ผ ์๋ก์ด ์ํ ๊ฐ์ ๋ฐํํด์ค๋ค.
๋ฆฌ๋์๋ ํ๋๋ง ์ฌ์ฉํด์ผํ๊ธฐ ๋๋ฌธ์ ๋ง์ฝ ๋ฆฌ๋์ ํจ์๋ฅผ ์ฌ๋ฌ ๊ฐ ์์ฑํ๋ค๋ฉด, ์ด๋ฅผ ํ๋๋ก ํฉ์ณ์ฃผ๋ ๊ณผ์ ์ด ํ์ํ๋ค. (๋ฃจํธ ๋ฆฌ๋์)
//modules/survey.js
//์ด๊ธฐ์ํ
const initialState = {
surveyResult: [],
};
//reducer ํจ์
const reducer = (state = initialState, action) => {
switch (action.type) {
case SURVEY_INIT:
return {
...state,
surveyResult: [],
};
case SURVEY_INSERT:
return {
...state,
surveyResult: state.surveyResult.concat(action.surveyResult),
};
default:
return state;
}
};
//modules/index.js
import { combineReducers } from 'redux';
import survey from './survey';
const rootReducer = combineReducers({
survey,//์ฌ๋ฌ ๊ฐ์ ๋ฆฌ๋์๋ผ๋ฉด ์ด์ด์ ์์ฑํด์ค๋ค.
});
export default rootReducer;
์คํ ์ด
๋ฆฌ์กํธ ์ดํ๋ฆฌ์ผ์ด์
์ ๋ฆฌ๋์ค๋ฅผ ์ ์ฉํ๊ธฐ ์ํด ๋ง๋ค์ด์ค์ผ ํ๋ ์ํ ์ ์ฅ์๋ผ๊ณ ์๊ฐํ๋ฉด ๋ ๊ฒ ๊ฐ๋ค. ์คํ ์ด๋ ํ๋์ ํ๋ก์ ํธ์ ํ๋๋ง ์กด์ฌํ๋ค. ํ๋ก์ ํธ์ ๋ฃจํธ ๋ ๋ฒจ์์ ์ํ ๊ด๋ฆฌ๋ฅผ ํ๊ธฐ ๋๋ฌธ์ ์คํ ์ด๋ index.js
ํ์ผ์์ ๋ง๋ค์ด์ค์ผํ๋ค. ์๋๋ ๋ฆฌ๋์ค์์ ์ ๊ณตํ๋ createStore
๋ก ์คํ ์ด๋ฅผ ๋ง๋ค์ด์คฌ์ง๋ง ์ด์ ๋ ์ญ์ ๋๊ธฐ ๋๋ฌธ์ @reduxjs/toolkit
์ configureStore
๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค. ๋ง์ง๋ง์ผ๋ก ์ปดํฌ๋ํธ์์ ์ฌ์ฉํ ์ ์๋๋ก <App>
์ปดํฌ๋ํธ๋ฅผ react-redux์์ ์ ๊ณตํ๋ <Provider>
๋ก ๋ฌถ์ด์ค์ผ ํ๋ค.
//src/index.js
import React from 'react';
import ReactDOM from 'react-dom/client';
import { configureStore } from '@reduxjs/toolkit';
import { Provider } from 'react-redux';
import './index.css';
import App from './App';
import rootReducer from './modules';
const store = configureStore({
reducer: rootReducer,
});
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
<React.StrictMode>
<Provider store={store}>
<App />
</Provider>
</React.StrictMode>
);
์ด์ ์ปดํฌ๋ํธ์์ ์ํ๋ฅผ ๊ฐ์ ธ๋ค ์ฐ๊ธฐ๋ง ํ๋ฉด ๋๋ค๐
connect
ํจ์๋ก ๋ฆฌ๋์ค๋ฅผ ์ฐ๋ํด์ ์จ๋ ๋์ง๋ง ๋๋ react-redux์์ ์ ๊ณตํ๋ Hook์ ์ด์ฉํ๋ค.
์ํ ์กฐํ๋ useSelector()
, ์ก์
๋์คํจ์น๋ useDispatch()
๋ฅผ ์ฌ์ฉํ์ผ๋ฉฐ connect
ํจ์์ ๋นํด ์ฝ๋์ ๊ธธ์ด๊ฐ ์งง์์ง๊ณ ๊ฐ๋
์ฑ์ด ์ข์์ง๋ค๋ ์ฅ์ ์ ๊ฐ๋๋ค.
useSelector() : ์ํ ์กฐํ
๋ฆฌ์กํธ์์ ๋ค๋ฅธ ํ์ด์ง๋ก ์ด๋ํ ๋ window.location.href="/"
์ ๊ฐ์ด ํ์ด์ง๋ฅผ ์๋ก๊ณ ์นจ ํ๋ ๋ฐฉ์์ผ๋ก ์ด๋ํ๊ฒ ๋๋ฉด state๊ฐ ์ด๊ธฐํ๋ผ์ ์ํ ์กฐํ๋ฅผ ํ ์ ์๋ค. ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด Link
์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ๋ฆฌ์กํธ ํ
์ธ useNavigate()
๋ฅผ ์ฌ์ฉํด์ฃผ๋ ๊ฒ์ด ์ข๋ค.
useDispatch() : ์ก์ ๋์คํจ์น
์คํ ์ด์ ๋ด์ฅ ํจ์์ธ dispatch๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ํด์ฃผ๋ ํ ์ด๋ค. ํจ์ ํ๋ผ๋ฏธํฐ๋ก๋ ์ก์ ๊ฐ์ฒด๋ ์ก์ ์์ฑ ํจ์๋ฅผ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.
import { useSelector, useDispatch } from 'react-redux';
const survey = useSelector((state) => state.survey.surveyResult);
const dispatch = useDispatch();
dispatch(surveyInsert(answer));
'๐ป Web' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[SpringBoot] JpaRepository ์์ฑ๊ณผ ๋ฐ์ดํฐ ์กฐํํ๊ธฐ๐ (0) | 2022.08.01 |
---|---|
[SpringBoot] H2 ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฌ์ฉ ๋ฐฉ๋ฒ (+์ค๋ฅ ํด๊ฒฐ) (0) | 2022.07.28 |
[React] Context API, useContext Hook ์ฌ์ฉํ๊ธฐ (2) | 2022.07.08 |