Hook

React 함수 내 최상위에서만 Hook을 호출해야 한다.

Table of contents

useState

useState의 경우 class 컴포넌트에서 작성했던 setState 방식의 단일 객체에 state값을 관리하는 방법을 사용할 수는 있으나, 여러 상태변수로 분할하는 것을 더 권장한다.
useState는 값을 대체하는 방식이기 때문에 단일 객체일 경우 수동 병합을 필히 진행해야한다.
상태 변수를 분할하면 사용자 정의 후크로 쉽게 추출 할 수 있습니다.

즉, 분할을 우선시 하되 연관성에 따라 묶음 필요하다.

// 가능o 권장x
const [state, setState] = useState({name: 'john', boolean: true })

const exam = () => {
   setState((preState) => ({...preState, boolean: false})) // 수동 병합
}

// 권장
const [name, setName] = useState('john')
const [boolean, setBoolean] = useState(true)

useEffect

화면의 그리기를 완료한 후 실행한다.
불필요한 reflow를 방지하기 위해 두번째 인자에 []를 표기할 수 있지만 effect 내에서 의존되는 값이 있으면, 두번째 인자에 표기를 하는 것이 안전하므로 권장된다.

의존성에 함수는 effect 내에서 선언하고 의존성 값을 추가하는 것을 권장한다.

// 권장x, 
const Exam = ({name}) => {
   const func = () => {
     console.log(name)
   }

   useEffect(() => {
      fun()
   }, [])
   
   ...
}

// 권장
const Exam = ({name}) => {
   useEffect(() => {
      const func = () => {
         console.log(name)
      }

   }, [name])

   ...
}

useMemo / useCallback

useMemo를 사용하지 않고 동작 구현이 된다면, 성능을 최적화시키는 용도로 추가 사용한다. 기억된 값을 반환한다. 의존성 배열의 값이 변경되었을 때에만 값을 새롭게 계산한다.

useCallback(fn, deps)는 useMemo(()=> fn, deps)와 같다. 즉, useCallback은 기억된 callback을 반환하며, 의존성이 변경되었을 때 callback을 새롭게 나타낸다.