리액트 리덕스 정리본
[React] Redux 사용하기 (feat. TypeScript)
1. redux 1.1. 리덕스란?단일 저장소(store): 리덕스는 하나의 중앙 저장소를 통해 애플리케이션의 상태를 관리 -> 상태의 일관성을 유지하고 디버깅이 쉬움불변성(Immutability): 리덕스는 상태를 직접
everydayc0ding.tistory.com
프로젝트 코드의 일부
import { configureStore } from "@reduxjs/toolkit";
import reducer from "./reducer/reducer";
const store = configureStore({ // 스토어 객체 생성
reducer
})
// 스토어의 상태 타입 정의
export type RootState = ReturnType<typeof store.getState>
// 디스패치 타입 정의
export type AppDispatch = typeof store.dispatch;
export default store;
import { useSelector, useDispatch, TypedUseSelectorHook } from "react-redux";
import { AppDispatch, RootState } from '../store';
// 커스텀 훅
export const useTypedSelector: TypedUseSelectorHook<RootState> = useSelector
export const useTypedDispatch = () => useDispatch<AppDispatch>();
궁금증1. 왜 useDispatch, useSelector 훅을 그대로 쓰지 않고 커스텀 훅을 만들어 쓰는가?
-> 타입의 안전성을 보장하기 위해
기본적으로 useDispatch 와 useSelector 는 타입 정보를 갖고 있지 않아서 타입스크립트가 dispatch 의 액션 타입이나 selector 가 조회할 state 의 타입을 알지 못한다. 커스텀 훅을 만들면 타입스크립트가 정확한 타입을 추론할 수 있도록 도와준다.
- useSelector 커스텀 훅
TypedUsedSelectorHook 은 useSelector 훅에 특정 상태 타입을 적용하기 위해 타입스크립트에서 사용하는 타입이다.
<RootState> 는 useSelector 의 인자로 들어올 조회할 state 의 타입
이렇게 정의해놓은 커스텀 훅을 사용하면, useSelector 와 동일하게 동작하지만 반환되는 state 의 타입이 RootState 로 고정되므로 타입스크립트가 타입을 알 수 있고 더 편하고 안전하게 사용할 수 있다.
// 기존 방식
const value = useSelector((state: RootState) => state.someReducer.value);
// 커스텀 사용시
const value = useTypedSelector(state => state.someReducer.value);
- useDispatch 커스텀 훅
useSelector 와 같이 dispatch 함수가 받을 수 있는 액션을 AppDispatch 타입으로 고정시켜 두어서 타입스크립트가 dispatch 할 때 어떤 액션을 받을 수 있는지 명확하게 알 수 있다.
// 기존 방식
const dispatch = useDispatch<AppDispatch>();
dispatch(someAction());
// 커스텀 훅 사용시
const dispatch = useTypedDispatch();
dispatch(someAction());
'TIL with Programmers' 카테고리의 다른 글
[TIL] 11/6 프론트엔드 심화3 - 모르는 것 정리 (0) | 2024.11.06 |
---|---|
[TIL] 11/5 프론트엔드 심화2 - 몰랐던 부분 정리 (0) | 2024.11.05 |
[TIL] 11/1 props, 모달창 만들기 (0) | 2024.11.01 |
[TIL] 10/31 클래스/함수형 컴포넌트, useState (0) | 2024.10.31 |
[TIL] 10/30 리액트 기초-1 (0) | 2024.10.30 |