React #12 UseSelector, useEffect, useReducer, useCallback

수박·2020년 8월 16일
0

react

목록 보기
12/15

React #12 UseSelector, useEffect, useReducer, useCallback


useSelector

useSelector로 스토어의 상태에 접근할 수 있다.

기존에 connect로 사용할 때 mapStateToProps와 비슷하다

const myData = useSelector(selector: Function, deps: any[]);

deps배열은 어떤 값이 변경되었을 때 selector을 재정의할 지 설정.

생략하면 매번 랜더링 될 때마다 selector함수도 새로 정의됨.

스토어에 정의된 초기 State를 가져오고 싶다면

const myData = useSelector((state) => state); 로 사용하며,

statecombineReducer로 묶인 모든 리듀서의 state이므로 모든 초기값을 호출한다.

특정 리듀서의 state를 가져오고 싶다면 state.등록된 리듀서 명으로 호출하며

우리 프로젝트에는

  const store = createStore(
    combineReducers({
      reducer,
      faqReducer}), enhancer);

로 두가지 리듀서만 현재 사용하고 있기에 선택해서 사용하면 된다.

reducer, faqReducerinitialStatestore에 저장되어 있으므로

특정 state를 불러올 땐 리듀서의 이름을 명시해주면 불러올 수 있다.

컴포넌트에서 useSelector으로 faqReducer의 state를 가져오는 코드

  const myData = useSelector((state) => state.faqReducer);

Side Effect

컴포넌트가 랜더링된 이후 비동기로 처리되어야하는 효과들을 Side Effect라함.

어떤 데이터를 가져오기 위해 외부 API호출시 랜더링을 먼저하고 실제 데이터를 비동기로 가져오는 것이 권장된다.

=> Json API에 있는 데이터를 가져오기 위해서 FAQ컴포넌트를 랜더링하고 실제 데이터를 axios를 통해 가져왔다.

그런데 처음 랜더링될 때 데이터를 가져오기 전이므로 undefined값이었기 때문에 존재하지 않는 값에 인덱스로 접근했기 때문에 에러가 발생한다. 이 에러를 처리하기 위해서 최신문법을 참고했다.

ES11 추가문법

  • Optional Chaining : ?.으로 사용하며, ?.왼쪽 연산자 값이 null또는 undefined이면 실행을 멈추고 undefined를 return`한다.
    • 존재하지 않을 수 있는 값에 대해 예외처리가 쉽게 가능하다.

useEffect

랜더링 완료이후에 실행되거나 어떤 값이 변경됐을 때에도 실행할 수 있음.

랜더링 결과가 돔에 반영된 뒤에 호출된다.

useEffect를 사용하면 데이터를 불러오는 방법을 파악하는데 도움이 된다고 한다.

useEffect에서 두번째 인자인 []은 버그를 일으키는 주된 원인이라고 한다.

의존성을 필요로 하는 상황을 제거하는 useReducer, useCallback을 알아두자.


useReducer

리듀서는 현재 상태 + 액션값을 전달 받아 새로운 상태를 반환함.

불변성을 지키면서 새로운 상태를 반환.

useReducer에서의 액션 객체는 꼭 type를 지닐 필요가 없음


useCallback

메모이제이션과 비슷한 기능을 하는 useMemo와 비슷한 함수.

컴포넌트가 리랜더링될 때마다 수행되는 함수들의 반복때문에 생기는 이슈들을 최적화하기 위해 사용한다.

0개의 댓글