Hook은 함수 컴포넌트에서 React state와 생명주기 기능(lifecycle features)을 "연동(hook into)" 할 수 있게 해주는 함수입니다.
- React 공식 문서
useState
같은 내장 Hook을 몇 가지 제공한다.개발을 하다 보면 가끔 상태 관련 로직을 컴포넌트 간에 재사용하고 싶은 경우가 생긴다. 이 문제를 해결하기 위한 전통적인 방법이 두 가지 있었는데, higher-order components와 render props가 바로 그것이다. Custom Hook은 이들 둘과는 달리 컴포넌트 트리에 새 컴포넌트를 추가하지 않고도 이것을 가능하게 해준다.
각 컴포넌트의 state는 완전히 독립적이다. Hook은 state 그 자체가 아니라, 상태 관련 로직을 재사용하는 방법이다. 실제로 각각의 Hook 호출은 완전히 독립된 state를 가진다. 그래서 심지어는 한 컴포넌트 안에서 같은 custom Hook을 두 번 쓸 수도 있다.
Custom Hook은 기능이라기보다는 컨벤션(convention) 에 가깝다. 이름이 "use"로 시작하고, 안에서 다른 Hook을 호출한다면 그 함수를 custom Hook이라고 부를 수 있다. useSomething이라는 네이밍 컨벤션은 linter 플러그인이 Hook을 인식하고 버그를 찾을 수 있게 해준다.
폼 핸들링, 애니메이션, 선언적 구독(declarative subscriptions), 타이머 등 많은 경우에 custom Hook을 사용할 수 있다.
componentDidMount() {
applyFirstLogic()
applySecondLogic()
}
// 관심사의 분리 - Data fetching
useEffect(() => {
applyFirstLogic()
}, [])
// 관심사의 분리 - Attach event listener
useEffect(() => {
applySecondLogic()
}, [])
this.state.foo
가 참조하는 값은 항상 최신 ⇒ 결과를 보장하기 힘듬(버그 발생)아래의 규칙을 지켜줘야 리액트가 각 훅의 상태를 제대로 기억할 수 있다. 훅은 함수 컴포넌트를 위한 기능이기 때문에 규칙 2에 의해 클래스형 컴포넌트의 메소드뿐만 아니라 기타 일반 함수에서도 사용할 수 없다.
규칙 1. 최상위(at the top level) 에서만 Hook을 호출해야 한다. 그리고 반복문, 조건문, 중첩된 함수 내에서 Hook을 실행하지 마라.
import React, { useState } from "react"
function Hooks(props) {
if (!props.isExist) {
const [state, setState] = useState(); // Error!
}
const [state2, setState2] = useState(); // Error!
}
// react가 여러 훅들을 구분할 수 있는 유일한 정보는 훅이 사용된 순서 뿐이기 때문.
규칙 2 : React 함수 컴포넌트 내에서만 Hook을 호출해야 한다. 일반 JavaScript 함수에서는 Hook을 호출해서는 안 된다. (Hook을 호출할 수 있는 곳이 딱 한 군데 더 있다. 바로 직접 작성한 custom Hook 내이다.)