component에 종속되지 않고 global state management를 합니다. props지옥을 탈출할 수 있습니다.
redux는 기본적으로 flux 패턴을 따릅니다.
Action -> Dispatch -> Store -> View
Copy yarn add redux react-redux redux-devtools-extension @reduxjs/toolkit
reducer는 꼭 불변성을 지켜야 합니다. 그래야 redux가 이전 상태와 바뀐 상태를 구분할 수 있습니다. 왜냐하면 참조 값이 바뀌었는지를 가지고 변경 여부를 판단하고, 바뀌었다고 판단해야 re-render가 일어납니다.
redux-persist는 browser storage에도 저장하여 새로고침하여도 데이터가 유실되지 않는 라이브러리 입니다.
Copy // store/index.js
import { createStore , combineReducers , applyMiddleware , compose } from 'redux' ;
import { composeWithDevTools } from 'redux-devtools-extension' ;
import { persistStore , persistReducer } from 'redux-persist' ;
// import storage from 'redux-persist/lib/storage'; // local storage
import storageSession from 'redux-persist/lib/storage/session' ;
import counter from './counter' ;
import todos from './todos' ;
// 전역으로 persist 쓰고자 할
// const persistConfig = {
// key: 'root',
// storage: storageSession,
// // whitelist: [], // whitelist에 있는 값들만 persist한다.
// // blacklist: [], // blacklist에 있는 거 빼고 전부 persist한다.
// };
const persistConfig = {
key : 'counter' ,
storage : storageSession ,
// whitelist: [], // whitelist에 있는 값들만 persist한다.
// blacklist: [], // blacklist에 있는 거 빼고 전부 persist한다.
};
const rootReducer = combineReducers ({
counter : persistReducer (persistConfig , counter) ,
todos
});
// const persistedReducer = persistReducer(persistConfig, rootReducer); // 전역으로 persist쓰고자 할 때
const middlewares = []; // 미들웨어들을 넣으면 된다.
const enhancer =
process . env . NEXT_PUBLIC_NODE_ENV === 'production'
? compose ( applyMiddleware ( ... middlewares))
: composeWithDevTools ( applyMiddleware ( ... middlewares));
const configureStore = () => {
let store = createStore (rootReducer , enhancer);
let persistor = persistStore (store);
return { store , persistor }
}
export default configureStore;
Copy // _app.jsx
import React from 'react' ;
import ReactDOM from 'react-dom' ;
import './index.css' ;
import App from './App' ;
import { Provider } from 'react-redux' ;
import { PersistGate } from 'redux-persist/integration/react'
import configureStore from './store' ;
const { store , persistor } = configureStore ();
ReactDOM .render (
< React.StrictMode >
< Provider store = {store}>
< PersistGate loading = { null } persistor = {persistor}>
< App />
</ PersistGate >
</ Provider >
</ React.StrictMode > ,
document .getElementById ( 'root' )
);