리덕스는 React 에서 가장 많이 사용되고 있는 상태관리 라이브러리 중 하나다
자바스크립트 라이브러리기 때문에 리액트 뿐만이 아니라 다른 언어에서도 사용 가능하다
@types/react-redux
추가 설치 필요npm i react-redux @types/react-redux
리덕스 툴킷은 기존 리덕스의 보일러 플레이트 코드를 줄이고, 좀 더 효율적인 개발을 할 수 있도록 도와주는 유틸리티이다
npm i @reduxjs/tookit
// index.tsx
import { Provider } from "react-redux";
import { store } from "./store";
const root = ReactDOM.createRoot(
document.getElementById("root") as HTMLElement
);
root.render(
<React.StrictMode>
<Provider store={store}>
<App />
</Provider>
</React.StrictMode>
);
import { configureStore } from "@reduxjs/toolkit";
import userReducer from "./userSlice";
export const store = configureStore({
reducer: userReducer,
middleware: (getDefaultMiddleware) => getDefaultMiddleware().concat(logger),
devTools: process.env.NODE_ENV !== 'production',
preloadedState: initialState,
enhancers: (defaultEnhancers) => [...defaultEnhancers]
});
export type AppDispatch = typeof store.dispatch;
export type RootState = ReturnType<typeof store.getState>;
combineReducers
combineReducers
함수를 사용하여 slice reducer를 병합한 rootReducer를 설정 가능
const rootReducer = combineReducers({
user: userReducer,
feed: feedReducer,
});
[참조] Define Root State and Dispatch Types
https://react-redux.js.org/using-react-redux/usage-with-typescript#define-root-state-and-dispatch-types
import { TypedUseSelectorHook, useDispatch, useSelector } from 'react-redux'
import type { RootState, AppDispatch } from './store'
export const useAppDispatch: () => AppDispatch = useDispatch
export const useAppSelector: TypedUseSelectorHook<RootState> = useSelector
import { createSlice } from "@reduxjs/toolkit";
import { User } from "../utils";
const initialState: { user: User | null } = {
user: null,
};
export const userSlice = createSlice({
name: "user",
initialState: initialState,
reducers: {
login: (state, action) => {
state.user = action.payload;
},
logout: (state) => {
state.user = null;
},
},
});
export const { login, logout } = userSlice.actions;
export default userSlice.reducer;