React Hook은 리액트 16.8 버전 이후 추가된 기능이며, 함수형 컴포넌트가 클래스형 컴포넌트의 기능을 사용할 수 있도록 해주는 기능 모음이다.
React의 컴포넌트 선언 방식은 함수형, 클래스형 2가지로 나뉜다. 사실상 클래스형 컴포넌트가 주를 이루었는데, 이는 클래스형이 React에서 제공하는 LifeCycle 함수라던지, state 활용 등 컴포넌트 구조화에 용이하기 때문이다. 하지만 클래스형 컴포넌트가 갖는 단점을 극복하고자 함수형 컴포넌트 사용을 적극 권장했고, 클래스형 컴포넌트에서만 사용가능했던 기능을 제공하기 위해 v16.8 부터 React hook을 통해 기능을 제공한다.
👽 React hook은 함수형 컴포넌트를 위한 추가 셋이다.
사실상 애초에 함수형으로 구현해도 내부적으로 잘 구성하면 될 것 같은데 왜 굳이 hook을 사용하여 구현해야 할까? 이는 함수와 class 간 자바스크립트 차이 때문이다.
먼저 최초 렌더 이후 컴포넌트 값의 변경으로 리렌더링이 될때, 함수형 컴포넌트는 내부에 작성된 코드가 다시 실행된다. 이는 함수형 컴포넌트들이 기존에 가지고 있던 상태(state)를 전혀 관리할 수 없게 만든다. 상태관리에 있어서 적합한 모델이 아니라는 얘기다. 그래서 함수형 컴포넌트를 Stateless Component 라고 불리는 것이다.
반면 클래스형 컴포넌트 내 메소드는 속성의 개념이므로, 리렌더링이 되더라도 render() 를 제외한 나머지 메소드와 state가 유지된다. 따라서 데이터에 대한 관리가 용이하고, 불필요한 리소스 사용을 줄일 수 있다.
👍 이러한 함수형 컴포넌트의 한계를 극복하기 위해 React hook이 개발된 것이다. hook을 통해 상태관리, 컴포넌트 최적화 등 함수형 컴포넌트가 가진 단점을 극복할 수 있다.
Hook에는 규칙이 있다. 이를 꼭 지켜야 정상적으로 hook이 실행되고 코드가 꼬이지 않는다.
eslint-plugin-react-hooks (ESLint 플러그인) 을 사용한다면 아래 두 규칙을 강제한다. (CRA에 포함)
Hook은 브라우저의 메모리 자원을 사용하기에 함부로 남발하면 오히려 성능저하를 불러올 수있다. 불필요한 호출을 줄이고, 적시적소에 사용하는 것이 바람직하다.
const [count ,setCount] = useState(0);
useEffect(() => {
document.title = 'ㅎㅇ';
});
import React, { createContext } from 'react';
export const UserContext = createContext();
- useReducer
- useCallback
- useMemo
- useRef
- useImperativeHandle
- useLayoutEffect
- useDebugValue
React 최적화 여부는 컴포넌트의 리렌더링에 의해 결정된다. 여기서 말하는 최적화는 불필요한 렌더를 줄이고, 중복되는 객체나, 결과 값을 재활용하는데 있다. React 컴포넌트가 렌더링을 수행하는 조건은 다음과 같다.
보통 hook의 사용을 최소화하고 useMemo(), useCallback() 등을 활용해 기존 선언된 리소스를 참조하여 사용함으로 앱을 최적화한다. 최적화에 대한 내용은 추후 포스팅에서 자세히 다루겠다.
참고 : https://velog.io/@goyou123/React-Hooks-%EC%B4%9D%EC%A0%95%EB%A6%AC
https://green-grapes.tistory.com/entry/React-%EB%A6%AC%EC%95%A1%ED%8A%B8-%ED%9B%85Hook%EC%97%90-%EB%8C%80%ED%95%B4%EC%84%9C-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90
https://k-developer.gitbook.io/dev/react/react-hook/usereducer