본문 바로가기
REACT

훅의 규칙

by 일태찡 2023. 3. 6.

 

  • (필수) 단순히 use로 시작하는 모든 함수입니다.

useState, useEffect, useReducer, 커스텀 훅,...

 

  • (필수) 리액트 훅은 리액트 컴포넌트 함수에서만 호출해야 합니다.

 

const emailReducer = (state, action) => {
  useState() // 불가능!
  if (action.type === 'USER_INPUT') {
    return { value: action.val, isValid: action.val.includes('@') };
  }
  if (action.type === 'INPUT_BLUR') {
    return { value: state.value, isValid: state.value.includes('@') };
  }
  return { value: '', isValid: false };
};

 

이렇게 단순 객체를 반환하는 함수에는 훅을 사용할 수 없습니다.

 

  • (필수) 리액트 훅은 리액트 컴포넌트 함수 또는 사용자 정의 함수의 최상위 수준에서만 호출해야 합니다.

 

useEffect(() => {
 console.log('HI');
 useContext(); // 불가능!
 
 return () => {
   console.log('HELLO');
 };
}, []);

 

if (true) {
  useState(); // 불가능!
}

 

중첩 문 또는 블록 문에서 호출하는 것은 허용되지 않습니다.

 

  • (권장) useEffect에서 항상 참조하는 모든 항목을 의존성으로 내부에 추가해야 합니다.

 

useEffect(() => {
  const identifier = setTimeout(() => {
    setFormIsValid(
      emailIsValid && passwordIsValid
    );
  }, 500);
  
  return () => {
    clearTimeout(identifier);
  };
}, [emailIsValid, passwordIsValid]); // setFormIsValid도 추가해야 하지만 이건 기본적으로 리액트에서 보장해줌

 

emailIsValid와 passwordIsValid처럼 주변 함수에 의해 노출되는 데이터는 반드시 의존성 배열에 넣어주어야 합니다.

'REACT' 카테고리의 다른 글

useContext 훅  (5) 2023.03.03
useReducer 훅  (5) 2023.03.02
커스텀 훅으로 HTTP 요청 리팩토링  (8) 2023.02.17
커스텀 훅(Custom Hook)  (10) 2023.02.16
리액트 최적화 테크닉  (7) 2023.02.14