Интуитивно мне понятно, почему, но я ищу подробное объяснение того, как компилируется React, что может вызвать побочный эффект с чем-то вроде этого.
const Header = () => {
const [counter, setCounter] = useState(0);
if (counter > 3) {
const [subtext, setSubtext] = useState("Secret message unlocked.");
}
const [headertext, setHeadertext] = useState("Hello World!");
const click = () => {
setCounter(counter + 1);
}
return {
<div>
<h1>{headertext}</h1>
<h2>{subtext}<h2>
<button onClick = {click}>Click Me!</button>
</div>
}
}
Обратите внимание, что в этом случае subtext
должно быть вообще не состоянием, а просто const subtext = counter > 3 ? 'Secret message unlocked.' : null;
.
Это из-за того, как React обрабатывает хуки. Все хуки имеют порядок связывания состояний и ссылок с правильным компонентом. Если перехват вызывается условно или внутри цикла, порядок вызовов перехватчиков может меняться между повторными рендерингами, нарушая внутреннюю логику React для обработки состояний.
Например, в вашем коде у вас есть 3 хука, и один из них находится внутри оператора if. Если это утверждение неверно, то у вас будет 2 хука, но реакция попытается найти 3 и сломается.
Потому что вы не можете условно вызывать перехватчики React. См. объяснение в React Rules of Hooks.