좌충우돌 개발자의 길

[React] 리액트 hook 정리 본문

STUDYING/React

[React] 리액트 hook 정리

sustronaut 2022. 10. 13. 16:51
hook hook 불면 기능이 넘치는 커다란 리액트 훅~

 

1. hook은 리액트에서 제공하는 내장 hook과 내가 직접 만든 custom hook으로 나뉜다

- 리액트에서 제공해주는 내장 hook : useState, useEffect, useParams,.... 등등

- custom hook : use___ 이렇게 작성! (여태 나는 반대로 알고 있었다 머쓱~)

 

2. hook 사용 시, 꼭 지켜야 할 규칙들

- 최상위에서만 hook 호출하자 (반복문, 조건문, 중첩된 함수 내에서 실행 금지!)

- React 함수 컴포넌트 내에서만 hook 호출하자

 

3. 내장 hook

- 기본 hook

1) useState

2) useEffect

=> 이 두 hook은 다른 글에서 자세히 다루었으므로 생략!

 

3) useContext

const value = useContext(MyContext);

- context 객체(React.createContext에서 반환된 값)을 받아 그 context의 현재 값을 반환

- context의 현재 값은 트리 안에서 이 Hook을 호출하는 컴포넌트에 가장 가까이에 있는 <MyContext.Provider> value prop에 의해 결정

- useContext의 인자 : context 객체 그 자체 여야함 (ex/ useContext(MyContext))

- context 값이 변경될 때마다 항상 리렌더링

- useContext를 Context.Provider와 같이 사용하자

// 예시
const themes = {
  light: {
    foreground: "#000000",
    background: "#eeeeee"
  },
  dark: {
    foreground: "#ffffff",
    background: "#222222"
  }
};

const ThemeContext = React.createContext(themes.light);

function App() {
  return (
    <ThemeContext.Provider value={themes.dark}>
      <Toolbar />
    </ThemeContext.Provider>
  );
}

function Toolbar(props) {
  return (
    <div>
      <ThemedButton />
    </div>
  );
}

function ThemedButton() {
  const theme = useContext(ThemeContext);
  return (
    <button style={{ background: theme.background, color: theme.foreground }}>
      I am styled by theme context!
    </button>
  );
}

 

- 추가 Hook

: 다른 훅은 뭐가 있나 살펴봤더니 useRef 말고 없었다... 그래서 하나하나 읽어보기로 결정!

 

1) useReducer

const [state, dispatch] = useReducer(reducer, initialArg, init);

// 두번째 인자 : 초기 state 전달
// 세번째 인자 : 초기 state를 조금 지연해서 생성

- useState의 대체 함수

- 다수의 하윗값을 포함하는 복잡한 정적 로직을 만드는 경우나 다음 state가 이전 state에 의존적인 경우에 보통 useState보다 useReducer를 선호

- 자세한 업데이트를 트리거 하는 컴포넌트의 성능을 최적화할 수 있게 하는데, 이것은 콜백 대신 dispatch를 전달 할 수 있기 때문

 

2) useCallback

const memoizedCallback = useCallback(
  () => {
    doSomething(a, b);
  },
  [a, b],
);

-  useCallback은 콜백의 메모이제이션된 버전을 반환 (메모이제이션된 콜백을 반환)

--> 메모이제이션(memoization)은 컴퓨터 프로그램이 동일한 계산을 반복해야 할 때, 이전에 계산한 값을 메모리에 저장함으로써 동일한 계산의 반복 수행을 제거하여 프로그램 실행 속도를 빠르게 하는 기술

- 콜백의 의존성이 변경되었을 때에만 변경

- 불필요한 렌더링을 방지

 

3) useMemo

const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);

- 메모이제이션된 값을 반환

-  useMemo는 의존성이 변경되었을 때에만 메모이제이션된 값만 다시 계산

- 모든 렌더링 시의 고비용 계산을 방지

- useMemo로 전달된 함수는 렌더링 중에 실행됨으로 렌더링 중에 하지 않는 것을 이 함수 내에서 하면 안됨