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

+1 501новая вакансия за сутки·57 707вакансий открыто сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python11 001
  • Облачные технологии7 882
  • QA вакансии2 530
  • Android1 457
  • Инженер данных929
  • Продакт-менеджер312

Разработка

  • iOS1 361
  • Backend вакансии1 335
  • AI вакансии645
  • Fullstack вакансии521
  • Frontend вакансии460
  • Mobile вакансии28

По стеку

  • Go6 500
  • Java3 643
  • Node.js1 203
  • Kotlin1 161
  • Rust1 155
  • .NET787
  • PHP334
  • C++285
  • C#211

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

  • Kubernetes4 701
  • Linux-инфраструктура3 588
  • DevOps вакансии3 059
  • Terraform / IaC2 617
  • Мониторинг и Observability1 284
  • CI/CD929
  • SRE345
  • Кибербезопасность28

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

  • Аналитик данных556
  • Data Scientist443
  • Бизнес-аналитик412
  • Системный аналитик71

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

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

По регионам

  • Вакансии в США28 307
  • Вакансии в Европе10 602
  • Работа в России3 671
  • Вакансии в Канаде2 400

По формату

  • Удалённые вакансии44 927
  • Релокация в США28 307
  • Гибридная работа6 438
  • Офисная работа5 670

По уровню

  • Senior вакансии25 431
  • Middle вакансии11 844
  • Junior вакансии4 210

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

Все компании
  • Wise190 вакансий
  • Rakuten189 вакансий
  • ASML164 вакансии
  • Grab135 вакансий
  • Celonis45 вакансий
  • Spotify36 вакансий
  • Infobip28 вакансий
  • Adyen27 вакансий
  • Monzo19 вакансий
  • Darktrace16 вакансий

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

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

В чём разница между useImperativeHandle и обычным ref?

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

useImperativeHandle позволяет родителю вызывать конкретные методы дочернего компонента через ref, не открывая весь DOM-узел. Обычный ref возвращает сырой DOM-элемент; useImperativeHandle возвращает объект с явно заданным публичным API.

useImperativeHandle — явный контракт

useImperativeHandle(ref, factory, deps) заменяет то, что видит родитель через ref.current, объектом, возвращённым из factory. Это позволяет предоставить минимальный, стабильный API.

// FancyInput.tsx
import { forwardRef, useImperativeHandle, useRef } from 'react';

export interface FancyInputHandle {
  focus: () => void;
  clear: () => void;
}

export const FancyInput = forwardRef<FancyInputHandle, { label: string }>(
  function FancyInput({ label }, ref) {
    const inputRef = useRef<HTMLInputElement>(null);

    useImperativeHandle(ref, () => ({
      focus() {
        inputRef.current?.focus();
      },
      clear() {
        if (inputRef.current) inputRef.current.value = '';
      },
    }), []);

    return (
      <label>
        {label}
        <input ref={inputRef} type="text" />
      </label>
    );
  }
);

Обычный ref и его ограничения

Когда родитель передаёт ref на <input>, он получает прямой доступ к DOM-узлу и может вызвать любой метод: ref.current.focus(), изменить value, вызвать click() и т.д. Для нативных элементов это приемлемо, но для составных компонентов — означает утечку деталей реализации.

Использование в родителе

import { useRef } from 'react';
import { FancyInput, FancyInputHandle } from './FancyInput';

export function Form() {
  const inputRef = useRef<FancyInputHandle>(null);

  return (
    <>
      <FancyInput ref={inputRef} label="Поиск" />
      <button onClick={() => inputRef.current?.focus()}>Фокус</button>
      <button onClick={() => inputRef.current?.clear()}>Очистить</button>
    </>
  );
}

Родитель может вызвать только focus() и clear() — весь DOM-узел скрыт.

React 19: ref как обычный prop

В React 19 forwardRef больше не нужен — ref передаётся как обычный prop. useImperativeHandle остаётся, но синтаксис упрощается:

// React 19 — без forwardRef
import { useImperativeHandle, useRef } from 'react';

export function FancyInput({
  label,
  ref,
}: {
  label: string;
  ref?: React.Ref<FancyInputHandle>;
}) {
  const inputRef = useRef<HTMLInputElement>(null);

  useImperativeHandle(ref, () => ({
    focus: () => inputRef.current?.focus(),
    clear: () => { if (inputRef.current) inputRef.current.value = ''; },
  }), []);

  return <input ref={inputRef} placeholder={label} />;
}

Когда это оправдано

  • Медиаплееры: play(), pause(), seek(time).
  • Модальные окна: open(), close().
  • Сложные редакторы: undo(), insertText(str).
  • Анимации через imperative API (GSAP, Framer Motion imperatives).

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

  • Злоупотребление imperative API: React декларативен — imperativeHandle нужен только тогда, когда декларативный подход неудобен (медиа, фокус, анимации). Бизнес-логику туда не кладут.
  • Забыли deps: если фабрика использует пропы или состояние, их нужно перечислить в deps; иначе ref.current будет содержать устаревшее замыкание.
  • Тип ref в TypeScript: родитель должен объявить useRef<FancyInputHandle>, а не useRef<HTMLInputElement>; несовпадение типов приводит к ошибкам компиляции.
  • Работает только с forwardRef (до React 19): без forwardRef ref не дойдёт до дочернего компонента.
  • Нет реактивности: изменение ref.current.someValue не вызывает ре-рендер — для реактивных данных используйте state/props.
  • Тестирование сложнее: RTL рекомендует тестировать через пользовательские взаимодействия, а не через ref-методы.

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

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

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

  • Выставлять императивное API там, где достаточно пропсов.
  • Забыть зависимости и оставлять stale-замыкания в методах.
  • Возвращать в handle обычные значения вместо стабильных функций.

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

  • Понимает ли мотив инкапсуляции.
  • Знает ли изменение API ref в React 19.
  • Может ли назвать сценарии, где обычный ref достаточен.

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

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

Источники

  • https://react.dev/reference/react/useImperativeHandle

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

Reactcomponent-designreact-hooks

Вакансии с этим навыком

React вакансии
  • AI Developer Intern
  • Senior Software Engineer
  • Lead Fullstack Engineer (React+Next.js) (#5392)
  • Full-stack Technical Lead (Java+React) (#5710)
  • Senior Engineering Manager - Agents and Context - Platform