0Pricing
React Academy · Урок

useTransition для неблокирующих обновлений интерфейса

Оборачивайте затратные обновления состояния в startTransition, чтобы интерфейс оставался отзывчивым.

«useTransition для неблокирующих обновлений интерфейса» — бесплатный урок React Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения React Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс React Academy содержит 4 уроков всего.

Добро пожаловать

В этом уроке Вы будете использовать хук useTransition, чтобы помечать ресурсоёмкие обновления состояния как не срочные и сохранять отзывчивость интерфейса, пока тяжёлая отрисовка выполняется в фоне.

Проблема блокирующего обновления

Когда Вы вводите текст в поле поиска, фильтрующем большой список, React должен повторно отрисовывать весь отфильтрованный список после каждого нажатия клавиши. Это блокирует немедленное обновление поля ввода и делает интерфейс медленным.

Конкурентный режим React

В React 18 появилась конкурентная отрисовка: React может начать отрисовку обновления состояния, приостановить её и отдать приоритет более срочным обновлениям, например вводу текста. useTransition — это хук, который позволяет классифицировать обновления как переходы с низким приоритетом.

Основы useTransition

useTransition возвращает `[isPending, startTransition]`. Оберните несрочное обновление состояния в `startTransition()`. React отдаст приоритет другим обновлениям, например управляемому полю ввода, а не переходу.
const [isPending, startTransition] = useTransition();

const handleChange = (e) => {
  setInputValue(e.target.value); // urgent: update input immediately
  startTransition(() => {
    setFilteredList(filter(e.target.value)); // non-urgent
  });
};

isPending для интерфейса загрузки

Пока переход выполняется, `isPending` имеет значение `true`. Используйте его, чтобы показать индикатор загрузки или сделать устаревший список результатов менее ярким, сообщая пользователям о выполняющемся обновлении.
return (
  <>
    <input value={inputValue} onChange={handleChange} />
    {isPending && <Spinner />}
    <ResultList items={filteredList} />
  </>
);

Что помещать в startTransition

Помещайте в startTransition только обновления состояния, но не асинхронные операции. Оборачивать нужно именно обновление состояния, запускающее ресурсоёмкую отрисовку.
// Correct
startTransition(() => setTab('heavy'));

// Wrong — async work outside React state
startTransition(async () => { await fetch(...); }); // not supported

startTransition без хука

Если Вам не нужен `isPending`, можно напрямую импортировать и вызвать `startTransition` из React без хука.
import { startTransition } from 'react';

startTransition(() => setQuery(newValue));

Пример переключения вкладок

Распространённый вариант использования: щелчок по вкладке переключает тяжёлый компонент. Оберните смену вкладки в startTransition, чтобы индикатор активной вкладки обновился сразу, пока тяжёлый компонент отрисовывается в фоне.
const [tab, setTab] = useState('posts');
const [isPending, startTransition] = useTransition();

const selectTab = (t) =>
  startTransition(() => setTab(t));

useTransition и useDeferredValue

useTransition предназначен для случаев, когда Вы владеете обновлением состояния (вызываете setState). useDeferredValue предназначен для случаев, когда Вы получаете свойство или значение, задержку которого нельзя напрямую контролировать: он откладывает само значение.

Не замена оптимизации

startTransition не ускоряет отрисовку — он лишь откладывает её. Если отрисовка компонента занимает 500 мс, она всё равно займёт 500 мс. Для действительно медленных списков сочетайте его с React.memo или виртуализацией.

Быстрая проверка

Что обозначает isPending, возвращаемый useTransition?

Повторение

useTransition позволяет классифицировать обновления состояния как несрочные переходы. Срочные обновления, например ввод, отрисовываются сразу, а переходы — когда у React есть свободные ресурсы. Используйте isPending, чтобы показывать обратную связь о загрузке.

Далее

Следующий урок: **useDeferredValue для устранения дребезга при вводе** — Вы научитесь откладывать повторную отрисовку медленных частей интерфейса, сохраняя быстрый отклик поля ввода.

Часто задаваемые вопросы

Урок «useTransition для неблокирующих обновлений интерфейса» бесплатный?

Да — полный текст урока «useTransition для неблокирующих обновлений интерфейса» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс React Academy, подпишись на CoddyKit PRO. Курс React Academy содержит 4 уроков всего.

Чему я научусь в уроке «useTransition для неблокирующих обновлений интерфейса»?

Оборачивайте затратные обновления состояния в startTransition, чтобы интерфейс оставался отзывчивым. Ты практикуешь React Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать React Academy?

Предыдущий опыт не требуется. React Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «useTransition для неблокирующих обновлений интерфейса»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке React Academy?

Да. Каждый урок React Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Состояния гонки и очистка эффектов
  2. useTransition для неблокирующих обновлений интерфейса
  3. useDeferredValue для устранения дребезга ввода
  4. Suspense для границ данных и кода
← Назад к React Academy