Почему бы не поместить хук useState в оператор if?

Интуитивно мне понятно, почему, но я ищу подробное объяснение того, как компилируется 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>
   }
}

Потому что вы не можете условно вызывать перехватчики React. См. объяснение в React Rules of Hooks.

Drew Reese 11.07.2024 08:08

Обратите внимание, что в этом случае subtext должно быть вообще не состоянием, а просто const subtext = counter > 3 ? 'Secret message unlocked.' : null;.

AKX 11.07.2024 08:08
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
2
62
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это из-за того, как React обрабатывает хуки. Все хуки имеют порядок связывания состояний и ссылок с правильным компонентом. Если перехват вызывается условно или внутри цикла, порядок вызовов перехватчиков может меняться между повторными рендерингами, нарушая внутреннюю логику React для обработки состояний.

Например, в вашем коде у вас есть 3 хука, и один из них находится внутри оператора if. Если это утверждение неверно, то у вас будет 2 хука, но реакция попытается найти 3 и сломается.

Другие вопросы по теме