학원 수업 Day29

redux-toolkit

redux-toolkit은 redux-saga에 비해 간편하게 상태관리를 할 수 있다.

redux 나 redux-saga 를 사용하면서 많은 파일, 함수들을 만들었던 것에 비해 createAsyncThunk(), createSlice() 만을 사용해서 개별 Slice 파일만 만들면 된다.

설치 또한 간편하다.

npm i @reduxjs/toolkit

한번만 설치하면 redux, redux-thunk, redux-saga가 모두 설치된다.

react 에서 사용을 위해 react-redux 만 별도로 설치하면 된다.


사용 방법

파일은 호출할 데이터 별 하나만 생성하면 된다.

src/redux 경로에 데이터Slice.js 라는 이름으로 생성했다.

그리고 최상단에 필요한 메서드를 불러온다.

import { createSlice, createAsyncThunk } from '@reduxjs/toolkit';
import axios from 'axios';


createAsyncThunk()

fetch 함수를 만들어서 async 함수를 수행한다.

createAsyncThunk(액션 타입, 프로미스 반환하는 비동기 함수, 옵션)

데이터를 createSlice로 보내서 상태를 관리하기 때문에 여기에서는 리듀서를 작성하지 않는다.

export const fetch데이터 = createAsyncThunk(
  // 고유 문자값 등록 (내부적으로 actionType 생성 시 활용)
  '데이터/request데이터',
  // 비동기 데이터 호출 함수
  async (파라미터)=>{
    const response = await axios.get(데이터_URL);
    return response.data.데이터;
  }
);


createSlice()

리듀서 함수가 있는 객체 ‘slice’ 를 반환한다.

정의된 리듀서를 기반으로 액션 타입 문자열과 액션 생성자 함수를 생성한다.

const 데이터Slice = createSlice({
  // 내부적으로 Reducer 생성 시 관리할 데이터가 들어갈 프로퍼티
  name: '데이터',
  initialState: { // 기본값
    data: [],
    isLoading: false,
  },
  extraReducers: {
    [fetch데이터.pending]: (state)=>{
      state.isLoading = true;
    },
    [fetch데이터.fulfilled]: (state, action)=>{
      state.isLoading = false;
      state.data = action.payLoad;
    },
    [fetch데이터.rejected]: (state)=>{
      state.isLoading = false;
    }
  }
});

3가지의 상태를 제공한다.

  • pending
    데이터 요청 전 상태로, 로딩 상태 등 설정할때 사용한다.

  • fulfilled
    데이터 요청 후 데이터를 가져오는데 성공한 상태이다.
    가져온 데이터를 payload 를 통해 store 에 저장한다.

  • rejected
    데이터를 요청했으나 가지고 오는데 실패한 상태이다.
    데이터를 저장할 수는 없지만, 요청은 이미 종료되었으므로 로딩 상태는 해제시켜 주도록 한다.


store 생성

import { configureStore } from '@reduxjs/toolkit';
import 데이터Reducer from './redux/데이터Slice';

const store = configureStore({
	reducer: {
		데이터: 데이터Reducer,
	}
})

리듀서를 store 에 담아 사용하기 위해 Slice 파일으로부터 export default 한 리듀서를 index.js 에 불러온다.

import { Provider } from 'react-redux';
<Provider store={store}>
  <App />
</Provider>

기존과 마찬가지로 App 컴포넌트를 Provider 로 감싸서 store를 전역에서 사용할 수 있도록 한다.


dispatch

기존과 동일한 방식으로 dispatch를 적용하는데 Slice 에서 생성한 fetch함수를 이곳에서 사용한다.

import { fetch데이터 } from './redux/데이터Slice';

fetch함수를 사용하기 위해 Slice 파일으로부터 import 한다.

import { useDispatch } from 'react-redux';
import { useEffect } from 'react';

마운트 될 때 dispatch 시켜야 하므로 useDispatch()useEffect()import 한다.

const dispatch = useDispatch();
useEffect(()=>{
  dispatch(fetch데이터(옵션객체));
}, []);


store 불러오기

컴포넌트에서 store를 불러오는 방법 또한 기존과 동일하게 useSelector() 를 사용한다.

import { useSelector } from 'react-redux';

const 데이터 = useSelector(store=>store.데이터.data);