Получить доступ

Какие правила хуков в React и почему их нельзя вызывать в условиях?

JuniorReact
Ещё спрашивают так:
  • Как написать свой хук?
Коротко

Хуки вызывают только на верхнем уровне компонента или своего хука — не в условиях, циклах и вложенных функциях — и только из React-функций. Причина: React хранит состояние хуков по порядку вызова; если порядок меняется между рендерами, состояние перепутается.

  • Свой хук — функция с именем use..., внутри вызывающая другие хуки
  • Свой хук переиспользует логику, а не состояние: у каждого вызова оно своё
  • Условие ставят внутри хука или эффекта, а не вокруг вызова

А ещё Линтер eslint-plugin-react-hooks проверяет правила

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Почему порядок. Состояние хуков хранится в списке, привязанном к экземпляру компонента. Первый useState — первая ячейка, второй — вторая. Если один вызов пропустили по условию, все последующие хуки прочитают чужие ячейки.

Свои хуки — основной способ переиспользовать логику с состоянием: useFetch, useLocalStorage, useMediaQuery. Имя с use нужно линтеру, чтобы проверять правила внутри.

Пример

function useDebouncedValue(value, ms) {
  const [debounced, setDebounced] = useState(value);
  useEffect(() => {
    const t = setTimeout(() => setDebounced(value), ms);
    return () => clearTimeout(t);
  }, [value, ms]);
  return debounced;
}

// ошибка
if (isLoggedIn) { const [x, setX] = useState(0); }

Что хотят услышать

  • Два правила.
  • Почему важен порядок вызовов.
  • Свои хуки.

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем