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;