- Redux Toolkit
Redux 표준 방식으로 만들어졌으며, 아래와 같이 세 가지 문제를 해결하기 위해 만들어졌다.
1) 기존 Redux Store 구성이 너무 복잡하다.
2) Redux에서 유용한 작업을 수행하려면 많은 패키지를 추가해야 한다.
3) Redux에는 너무 많은 상용구 코드가 필요하다.
- 주요 API
1. configureStore() : Store를 구성하는 API로 Slice Reducer를 자동으로 결합하고, 제공하는 모든 Redux MiddleWare, redux-thunk, Redux DevTools Extension을 사용할 수 있다.
2. createSlice() : Reducer 함수의 객체, Slice 이름, 초기 상태 값을 받아들이고 해당 Action 생성자와 Action 유형으로 Slice Reducer를 자동으로 생성한다. createAction + createReducer 느낌이다.
3. createAsyncThunk() : 비동기 Action 처리를 위한 함수로 pending / fulfilled / rejected 속성으로 case에 따라 데이터 처리를 할 수 있다.
- 예제
- Store 생성
import { combineReducers, configureStore } from "@reduxjs/toolkit";
import { resultSlice } from "./resultSlice";
// helper 함수인 combineReducers를 사용해 자동적으로 병합하여 Reducer 생성
const reducer = combineReducers({ resultSlice: resultSlice.reducer});
// configureStore로 Store 생성
export default configureStore({
reducer,
});
- Slice 및 Thunk 생성
import { createAsyncThunk, createSlice } from "@reduxjs/toolkit";
// 비동기 Thunk 생성
export const searchResultRequest = createAsyncThunk(
// action type
"request",
// 비동기 요청
async (매개변수를 넣을 수 있음) => {
const response = await api.get("요청 URL");
return response.data;
}
);
// Slice 생성
export const resultSlice = createSlice({
name: "result",
// 초기 값 설정
initialState: {data: []},
// 기본 reducer action logic 추가하는 곳
reducers: {},
extraReducers: {
// pending(대기), fulfilled(완료), rejected(거부) 세 가지를 이용하여 경우에 따라 처리 가능
[searchResultRequest.fulfilled]: (state, { payload }) => {
state.data = payload.data; // payload = action에 넘겨진 Data
}
},
});
export default resultSlice.reducer;
- Provider Wrapping
import React from "react";
import ReactDOM from "react-dom";
import "./index.css";
import App from "./App";
import { Provider } from "react-redux";
import store from "./redux/store";
ReactDOM.render(
<React.StrictMode>
<Provider store={store}>
<App />
</Provider>
</React.StrictMode>,
document.getElementById("root"),
);
- useDispatch & useSelector
import React from "react";
import { useSelector } from "react-redux";
import { useDispatch } from "react-redux";
import { searchResultRequest } from "../../redux/resultSlice";
const example = () => {
// dispatch 사용
const dispatch = useDispatch();
// resultSlice의 data를 선택
const resultLists = useSelector((state) => state.resultSlice.data);
//dispatch로 searchResultRequest 실행
dispatch(searchResultRequest(넣을 매개변수));
};
기존에 짠 코드에서 보기 쉽게 수정하다 보니 좀 빈약해 보이지만, 동작 방식을 정리하면 dispatch로 searchResultRequest를 실행하면 createAsyncThunk에 정의한 대로 비동기 요청을 보낸 뒤, extraReducers에 정의한 대로 (fulfilled) state를 갱신 및 store에 보관한다.
잘못된 내용이나 보완이 필요하다면 댓글 부탁드립니다!
'개발에 도움이 되는 > Redux' 카테고리의 다른 글
RTK Query (0) | 2022.02.26 |
---|---|
Redux (0) | 2021.11.14 |