Redux Toolkit은 redux에서 지원하는 개발 도구이다.
Redux Toolkit은 아래와 같은 Redux의 문제점을 보안해 준다.
Redux Toolkit
을 사용하면 자체적으로 immer를 내부적으로 도입해서 사용하고 있어 코드의 양이 줄어든다.(boilerplate)Redux 툴킷에는 Redux 코어와 Redux 응용 프로그램(예: Redux Thunk 및 Reselect)을 구축하는 데 필수적이라고 생각하는 기타 주요 패키지가 포함되어 있다.
npm install react-redux @reduxjs/toolkit
기존 Redux 사용 방식에서 아래와같이 변경한다.
Slice는 CreateSlice
를 통해 Action과 Reducer를 한 번에 정의할 수 있다.
슬라이스를 식별하기 위한 문자열 이름(name)
, 초기 상태 값(initialState)
, 상태 업데이트 방법(reducers)
을 정의한다.
src/services/store/slice/user.ts
import { createSlice } from '@reduxjs/toolkit';
export const initialState = {
name: null,
isLogin: false,
};
export const userSlice = createSlice({
name: 'user',
initialState,
reducers: {
setUserName: (state, action) => {
state.name = action.payload;
},
setUserLogin: (state, action) => {
state.isLogin = action.payload;
},
},
});
export const { setUser, setUserLoading } = userSlice.actions;
export default userSlice.reducer;
슬라이스에서 리듀서 함수를 가져와서 스토어에 추가한다.
combineReducers
를 사용하여 사용할 리듀서를 사용할 키값과 함께 정의한다.configureStore
를 실행하여 옵션과 함께 스토어를 생성한다.reducer
에 combineReducers
으로 생성한 rootReducer
를 넣어준다.middleware
배열을 반환하는 옵션으로 미들웨어를 사용할 수 있다getDefaultMiddleware와 함께 툴킷에서 제공하는 기본 미들웨어를 호출하고 다른 미들웨어를 배열에 넣어 같이 사용할 수 있다.import { combineReducers, configureStore } from '@reduxjs/toolkit';
import logger from 'redux-logger';
import userReducer from './slice/user';
/*
slice(Action과 Reducer를 한번에 정의한 것)
*/
const rootReducer = combineReducers({
userReducer: userReducer,
});
const store = configureStore({
reducer: rootReducer,
middleware: (getDefaultMiddleware) => getDefaultMiddleware().concat(logger),
// preloadedState (서버 사이드 렌더링 전용)
});
export type RootState = ReturnType<typeof store.getState>;
export default store;
저장소가 생성되면 애플리케이션(<App>
) 주위에 React-Redux <Provider>
를 감싸 생성된 저장소(store)를 전달한다.
src/index.tsx
import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';
import { Provider } from 'react-redux';
import store from 'src/services/store';
const root = ReactDOM.createRoot(
document.getElementById('root') as HTMLElement
);
root.render(
<React.StrictMode>
<Provider store={store}>
<App />
</Provider>
</React.StrictMode>
);
reportWebVitals();
import React from 'react';
import { useSelector, useDispatch } from 'react-redux';
import { RootState } from 'src/services/store';
import { setUserName } from 'src/services/store/slice/user';
const MainPage = () => {
const dispatch = useDispatch();
const user = useSelector((state: RootState) => state.userReducer);
console.log(user);
return (
<div>
<button
onClick={()=> dispatch(setUserName('raeyoung'))}
>
test
</button>
</div>
);
};
export default MainPage;