Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+666новых вакансий за сутки·52 265вакансий открыто сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании5 686
РезюмеAIПодготовкаСтатьи
ТарифыТарифы
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 394 кандидата открыты к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python5 973
  • Облачные технологии4 523
  • QA вакансии1 689
  • Android1 143
  • Инженер данных788
  • Продакт-менеджер308

Разработка

  • iOS1 093
  • Backend вакансии1 020
  • Fullstack вакансии448
  • AI вакансии378
  • Frontend вакансии369
  • Mobile вакансии27

По стеку

  • Go3 345
  • Java2 037
  • Kotlin908
  • Node.js746
  • Rust492
  • .NET481
  • PHP278
  • C++213
  • C#199

DevOps и инфраструктура

  • Kubernetes2 562
  • Linux-инфраструктура2 030
  • DevOps вакансии1 855
  • Terraform / IaC1 548
  • CI/CD876
  • Мониторинг и Observability709
  • SRE229
  • Кибербезопасность40

Аналитика и данные

  • Аналитик данных479
  • Data Scientist443
  • Бизнес-аналитик342
  • Системный аналитик50

Другие направления

  • Проджект-менеджер107
  • UI/UX дизайн70
  • Ручное тестирование14

По регионам

  • Вакансии в США24 039
  • Вакансии в Европе9 373
  • Работа в России2 968
  • Вакансии в Канаде2 114

По формату

  • Удалённые вакансии41 595
  • Релокация в США24 039
  • Гибридная работа3 695
  • Офисная работа2 766

По уровню

  • Senior вакансии22 591
  • Middle вакансии11 778
  • Junior вакансии3 695

Сейчас нанимают

Все компании
  • Rakuten189 вакансий
  • ASML163 вакансии
  • Grab134 вакансии
  • Wise81 вакансия
  • Infobip28 вакансий
  • Darktrace17 вакансий
  • Spotify17 вакансий
  • Celonis14 вакансий
  • UiPath13 вакансий
  • Adyen9 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К подготовке по вакансии←К теме ReactВсе вопросы
ReactJuniorТеория

Объясните правила хуков. Почему хуки нельзя вызывать условно?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

Хуки нельзя вызывать условно или в циклах, потому что React идентифицирует их по порядку вызовов в Fiber-узле. Нарушение порядка приводит к тому, что React возвращает данные не того хука.

Правило 1: вызывать хуки только на верхнем уровне

Хуки нельзя вызывать внутри условий, циклов, вложенных функций или после оператора return. Они должны вызываться всегда в одном и том же порядке при каждом рендере.

// НЕПРАВИЛЬНО
function BadComponent({ isLoggedIn }: { isLoggedIn: boolean }) {
  if (isLoggedIn) {
    const [user, setUser] = useState(null); // условный вызов — ошибка
  }

  for (let i = 0; i < 3; i++) {
    useEffect(() => {}); // хук в цикле — ошибка
  }
}

// ПРАВИЛЬНО
function GoodComponent({ isLoggedIn }: { isLoggedIn: boolean }) {
  const [user, setUser] = useState(null); // всегда вызывается

  useEffect(() => {
    if (isLoggedIn) {
      fetchUser().then(setUser); // условие ВНУТРИ хука
    }
  }, [isLoggedIn]);

  return isLoggedIn ? <Profile user={user} /> : <Login />;
}

Правила хуков в React

React Hooks подчиняются двум жёстким правилам, нарушение которых приводит к труднодиагностируемым багам или ошибке времени выполнения.

Правило 2: вызывать хуки только из функциональных компонентов или кастомных хуков

Нельзя вызывать хуки из обычных JavaScript-функций, классовых компонентов, обработчиков событий или таймеров. Кастомный хук — это функция, имя которой начинается с use, и внутри неё хуки разрешены.

// Кастомный хук — правильное место для хуков вне компонента
function useWindowWidth() {
  const [width, setWidth] = useState(window.innerWidth);

  useEffect(() => {
    const handler = () => setWidth(window.innerWidth);
    window.addEventListener('resize', handler);
    return () => window.removeEventListener('resize', handler);
  }, []);

  return width;
}

// Использование в компоненте
function ResponsiveLayout() {
  const width = useWindowWidth(); // OK: вызов в компоненте
  return <div>Ширина: {width}px</div>;
}

// НЕПРАВИЛЬНО: вызов хука вне компонента / кастомного хука
function regularFunction() {
  const [value, setValue] = useState(0); // ошибка
}

Почему нельзя вызывать хуки условно — механика React

React хранит state и эффекты каждого компонента в связном списке («hooks list» внутри Fiber-узла). Каждый вызов хука при рендере ставится в очередь по порядку вызова. React не хранит имена хуков — только их порядковые номера (слоты).

При следующем рендере React ожидает получить хуки в точно таком же порядке, чтобы вернуть каждому хуку его данные из предыдущего рендера. Если порядок нарушается — React достаёт не тот state и выдаёт ошибку.

// Представим внутреннее состояние React (упрощённо):
// Рендер 1 (isLoggedIn = true):
//   slot[0] = useState(null)   → user state
//   slot[1] = useEffect(...)   → fetch effect

// Рендер 2 (isLoggedIn = false, если useState в if):
//   slot[0] = useEffect(...)   → React думает, что это user state! БАГИ!

// React явно бросает ошибку:
// "React has detected a change in the order of Hooks called by BadComponent."

Именно поэтому порядок должен быть детерминированным: не «может быть 2 хука», а «всегда ровно 2 хука», независимо от условий.

ESLint-плагин для автоматической проверки

npm install eslint-plugin-react-hooks --save-dev
// .eslintrc.js
module.exports = {
  plugins: ['react-hooks'],
  rules: {
    'react-hooks/rules-of-hooks': 'error',   // нарушение правил — ошибка
    'react-hooks/exhaustive-deps': 'warn',   // пропущенные зависимости — предупреждение
  },
};

Подводные камни

  • Ранний return до вызова хуков — даже ранний выход из компонента нарушает правило, если хуки объявлены после него. Все хуки должны быть до первого return.
  • Хук в try/catch — если хук бросает исключение при первом рендере, следующий рендер получит сдвинутый список. Хуки внутри try-блоков неявно нарушают порядок вызовов при ошибках.
  • Имя кастомного хука не начинается с use — ESLint-плагин и React не смогут отличить его от обычной функции и не будут проверять правила внутри неё. Всегда называйте useSomething.
  • Вызов хука в обработчике события — частая ошибка новичков: onClick={() => useState(0)}. Хуки нельзя вызывать внутри event handlers, только в теле компонента.
  • Хуки в классовых компонентах — технически невозможно (бросает ошибку), но при миграции разработчики иногда пытаются импортировать хук и вызвать его в методе. Используйте HOC или render prop для интеграции хуков с классами.
  • Динамическое количество кастомных хуков — если вы генерируете список хуков через map (например, fields.map(f => useField(f))), это тоже нарушение. Вместо этого хук должен принимать массив и управлять им внутри себя.

Частые вопросы на собеседовании

  • Что такое хук useEffect и как работает его массив зависимостей?
  • Объясните хук useState. Какие типичные ошибки возникают при обновлении состояния?
  • В каких типах frontend-проектов React даёт реальный выигрыш, а где будет избыточен или неудачен?
  • Каковы основные отличия React 18 от React 19?

Типичные ошибки

  • Звать хук внутри if/for/early-return.
  • Звать хук из обычной функции, не из компонента или кастомного хука.
  • Полагать, что use(...) отличается от других хуков и его можно условно.

Что проверяет интервьюер

  • Может ли объяснить устройство связанного списка хуков.
  • Знает ли, что use() — тоже хук.
  • Применяет ли ESLint-правило react-hooks.

Как вы знаете этот вопрос?

Проверить себя по теме React →

Источники

  • https://react.dev/reference/rules/rules-of-hooks
←Предыдущий вопросОбъясните хук useState. Какие типичные ошибки возникают при обновлении состояния?Следующий вопрос→В каких типах frontend-проектов React даёт реальный выигрыш, а где будет избыточен или неудачен?

Связанные темы

Reactreact-hooksTooling