//기존 프로그램에 추가할 때
npm i @reduxjs/toolkit
npm i react-redux
//cra 와 같이 시작할 때+typescript
npx create-react-app my-app --template redux-typescript
리덕스 스토어를 구성하는 방법을 간소화 하고 보일러 플레이트 코드를 줄이기 위해 만들어졌다.
데이터 캐싱을 위한 쿼리도 포함하고 있으니 나중에 시간 나면 공부 해 볼것!
Getting Started | Redux Toolkit
const store = configureStore({
reducer: {
todos: todoSlice.reducer,
},
});
//★★★★★★ 밑에서 자세히 볼 거
export type RootState = ReturnType<typeof store.getState>
export type AppDispatch = typeof store.dispatch
root.render(
<Provider store={store}>
<React.StrictMode>
<App />
</React.StrictMode>
</Provider>
);
const initialState: TodosType = [초기값];
export const todoSlice = createSlice({
name: "todos",
initialState,
reducers: {
add: (state, action: PayloadAction<string>) => {
state.push({ id: ++nextId, content: action.payload, isDone: false });
},
},
});
useSelector
타입스크립트에서 리덕스 툴킷을 사용해주기 위해서는 useSelector 를 불러올 때도 타입지정을 해야 한다.
export type RootState = ReturnType<typeof store.getState>
export type AppDispatch = typeof store.dispatch
const todos = useSelector((state: RootState) => state.todos);
//state 에 RootState 를 넣어준다.
useDispatch
slice 는 액션 함수를 자동적으로 생성해준다. 함수 안에 들어간 파라미터는 payload 로 인식된다.
dispatch(todoSlice.actions.toggle(id));
RootState, AddDispatch 의 구성요소를 가져오는 방법을 사용해도 되지만 애플리케이션에서 사용할 useDispatch 및 useSelector 의 지정된(typed) version 을 만드는 것이 좋다.
**useSelector**
을 사용할 때 state:RootState 를 매번 작성해줄 필요가 없다.**useDispatch**
에서 thunk 를 사용하려면 thunk 미들웨어 type 을 포함하는 커스텀된 AppDispatch 를 useDispatch 와 같이 사용해야한다. 미리 useDispatch Hooks 를 만들어주고 필요한 곳에서 Import 해서 써라? 이런 뉘앙스로 추정export const useAppDispatch: () => AppDispatch = useDispatch
export const useAppSelector: TypedUseSelectorHook<RootState> = useSelector
이렇게 만들어놓고 useDispatch, useSelector 대신 써라.
export type RootState = ReturnType<typeof store.getState>;
export default store;
export type AppDispath = typeof store.dispatch;
import { TypedUseSelectorHook, useDispatch, useSelector } from "react-redux";
import { AppDispath, RootState } from "..";
export const useAppDispatch: () => AppDispath = useDispatch;
export const useAppSelector: TypedUseSelectorHook<RootState> = useSelector;
[**useAppDispatch]**
import { useAppDispatch } from "../store/hooks";
const dispatch = useAppDispatch();
const handleClickDone = (id: number): void => {
dispatch(todoSlice.actions.toggle(id));
};//여긴 원래대로 사용해주면 됨
[**useAppSelector]**
//기존 코드
const todos = useSelector((state: RootState) => state.todos);
****//바뀐 코드
****const todos = useAppSelector((state) => state.todos);