※ 공식문서를 읽고 정리한 글입니다.
Hook을 소개하면서 컴포넌트 최상위에서만 Hook을 호출할 것, React함수와 Custom Hook에서만 Hook을 호출할 것 이라는 2가지 원칙을 소개했었다. React함수와 Custom Hook에서만 Hook을 호출해야 하는 것은 당연해 보이지만, 컴포넌트 최상위에서만 Hook을 호출해야 하는 이유에 대해서는 잘 납득이 되지 않는다. 공식문서에 이와 관련된 설명이 나와있다.
function Form() {
// 1. name이라는 state 변수를 사용하세요.
const [name, setName] = useState('Mary');
// 2. Effect를 사용해 폼 데이터를 저장하세요.
useEffect(function persistForm() {
localStorage.setItem('formData', name);
});
// 3. surname이라는 state 변수를 사용하세요.
const [surname, setSurname] = useState('Poppins');
// 4. Effect를 사용해서 제목을 업데이트합니다.
useEffect(function updateTitle() {
document.title = name + ' ' + surname;
});
// ...
}
if (name !== '') {
useEffect(function persistForm() {
localStorage.setItem('formData', name);
});
}
useEffect(function persistForm() {
// 조건문이 필요하면 useEffect 안에다 집어넣을것
if (name !== '') {
localStorage.setItem('formData', name);
}
});
npm install eslint-plugin-react-hooks --save-dev
// ESLint 설정 파일
{
"plugins": [
// ...
"react-hooks"
],
"rules": {
// ...
"react-hooks/rules-of-hooks": "error", // Checks rules of Hooks
"react-hooks/exhaustive-deps": "warn" // Checks effect dependencies
}
}