공식문서 링크 : https://ko.reactjs.org/docs/hooks-overview.html\
Hook 이전에는?
- Hook은 16.8버전부터 생겼다. 그래서 이전에 제작된 프로젝트의 경우는 Class component를 사용한 경우가 있다.
- 현재는 재사용성에 있어 장점이 있기 때문에 대부분 Funtional component와 Hook을 사용한다.
Hook은 왜 생겼는가?
- 기존 Class Component 의 단점을 보완하면서 Life Cycle 등과 관련된 함수를 재사용 가능토록 하는것이 주 목적
- 컴포넌트간 상태 로직을 재사용하기에 어려웠다. → 계층의 변화 없이 상태 관련 로직을 재사용 할 수 있도록 도와줍니다.
- 복잡한 컴포넌트를 이해하기 어려웠다. → 기존 Class component 내에서의 생명주기와 그 내에서의 작업들로 인해 버그가 쉽게 발생하고 무결성을 쉽게 해치는 상황이었다.
현재의 Hook은 구독 설정 및 데이터를 불러오는 것과 같은 로직으로 Hook을 통해 비슷한 함수의 묶음으로 컴포넌트를 나누는 방법을 사용할 수 있다.
- Class는 사람과 기계를 혼동시키기 쉬웠다. → React 내에서 Class를 사용하려면 JS 내에서 this 바인딩에 대해 명확히 알아야만 했으며 이는 충분히 어려웠다고 할 수 있다.
- 더 자세한 내용은 공식문서를 참조.
Hook의 개요
- 기존엔 state를 사용하려면 꼭 Class component를 사용했어야 했다.
⇒ 하지만 Hook은 class 없이 state와 다른 react의 기능들을 사용할 수 있게 한다.
- Hook이란 ?
⇒ Funtional component에서 React state와 생명주기 기능을 연동(hook into)할 수 있게 해주는 함수.
- Hook은 Class 내에서는 동작하지 않는 대신, Class 없이 React를 사용할 수 있게 하는 것.
- React 내에서 useState와 같은 기본 내장 Hook을 몇 가지 제공한다.
- Hook은 기존 state를 버리고 대체, Class Component의 this.setState는 기존 state에 병합.
- 배열 구조 분해 문법에 대해서는 나중에 생각해 보세요.
- custom Hook은 여러가지 Hook을 모아둔 것.
- 아래는 버튼을 클릭하면 값이 증가하는 카운터입니다.
import React, { useState } from 'react';
function Example() {
const [count, setCount] = useState(0);
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>
Click me
</button>
</div>
);
}
Hook 사용 규칙
- Hook은 반드시 최상위 레벨에서 호출해야 함. 중첩된 함수 내에서 절대 No.
- Hook은 반드시 React Funtional component 내에서, 혹은 custom Hook 내에서만 호출해야 한다.
기본 제공 Hook
- useState
→ 이전 값을 인자로 / 초기화 지연(함수)
- useEffect
→ 의존성 배열. 모든 변경시 / [] / [a,b]
- useContext
추가 제공 Hook
- useReducer
→ useState를 대체함. state / Reducer / action = Redux
- useCallback
- useMemo
- useRef
→ current라는 상자에 담으며 내용의 변경은 알려주지 않음. ⇒ 콜백 ref 사용.
- useImperativeHandle
- useLayoutEffect
→ useEffect와 유사하나 모든 DOM 변경 후 브라우저가 화면을 그리기 이전 시점에 동기적으로 수행됨.
- useDebugValue