store.js
import { configureStore } from '@reduxjs/toolkit'; import bookmarkSlice from './detail/bookmarkSlice'; const store = configureStore({ reducer: { bookmarkReducer: bookmarkSlice.reducer, }, }); export default store;
bookmarkSlice.js 👉🏽 수정 X
bookmarkPage.js 👉🏽 수정 X
store.js
import { configureStore } from '@reduxjs/toolkit'; import bookmarkSlice from './detail/bookmarkSlice'; import storage from 'redux-persist/lib/storage'; import { combineReducers } from '@reduxjs/toolkit'; import { persistReducer } from 'redux-persist'; // 1) persistReducer의 두 번째 인자 const reducers = combineReducers({ // 각 리듀서들을 하나로 합쳐준다 🌿pikaBookmarkReducer: bookmarkSlice.reducer, }); // 2) persistReducer의 첫 번째 인자 const persistConfig = { // 상태 지속 시 정보들 작성 key: 'root', storage, whitelist: [🌿'pikaBookmarkReducer'], // 유지하고 싶은 항목 }; // 3) 지속되는 리듀서 만들기 const myPersistedReducer = persistReducer(persistConfig, reducers); // 4) 지속되는 리듀서 넣어주기 const store = configureStore({ reducer: myPersistedReducer, middleware: (getDefaultMiddleware) => // 5) getDefaultMiddleware 미들웨어 사용 getDefaultMiddleware({ serializableCheck: false, }), }); export default store;
persistReducer
의 두 번째 인자로 들어갈 리듀서 묶음 만들기reducers
라는 변수명으로 저장)persistReducer
의 첫 번째 인자로 들어갈 persistConfig
작성
- storage: 로컬 스토리지에 저장
- whitelist: 유지하고 싶은 리듀서 이름을 배열의 요소로 (문자열로) 넣는다.
(🌿🌿🌿 whitelist에서 항목으로 쓰이는 리듀서 이름과 combineReducers로 합칠 때의 리듀서 이름, useSelector로 상태 불러올 때의 리듀서 이름을 맞춰줘야 한다.)
해당 미들웨어 없이는 직렬화가 불가능한 값을 전달했다는 에러가 발생
App.js
... import { PersistGate } from 'redux-persist/integration/react'; // PersistGate 불러오기 import { persistStore } from 'redux-persist'; // persistStore 불러오기 export const persistor = persistStore(store); function App() { return ( <Provider store={store}> <PersistGate loading={null} persistor={persistor}> // PersistGate 적용 ... <Routes> <Route path="/" element={<Question />} /> ... </PersistGate> </Provider> ); } export default App;
persistor
라고 네이밍)를 반환한다.
- loading: 로딩 과정에서 보여줄 컴포넌트
- persisor: 로컬 스토리지에 저장할 스토어 객체
BookmarkPage.js
export default function BookmarkPage() { const bookmarks = useSelector((state) => state.pikaBookmarkReducer); // 리듀서 이름 맞춰주기 ...
pikaBookmarkReducer
) 맞춰주기 참고
- redux-persist 사용법 (redux-toolkit 적용 X)
- 새로고침 시에도 유지되는 store 만들기 (redux-toolkit 적용 O)