Menu

React 19: новые возможности, удалённые API и обновление

React 19 добавил Actions, useActionState, useOptimistic, use, ref как пропс и метаданные документа, а 19.2 добавил Activity и useEffectEvent. Каждая возможность в работе, что было удалено и как обновиться.

На этой странице есть исполняемые редакторы: меняйте, запускайте и сразу видите результат.

React 19 это мажорная версия React, вышедшая в декабре 2024 года. Она добавляет Actions (асинхронные функции, которые управляют состоянием ожидания, ошибками и формами), хуки useActionState, useOptimistic и use, ref как обычный пропс и теги <title> и <meta>, которые React переносит в head документа. React 19.2 (октябрь 2025 года) добавил <Activity> и useEffectEvent.

Каждый пример ниже работает на React 19.2. Вот Action: асинхронная функция, переданная форме, а состоянием ожидания и возвращённой ошибкой управляет useActionState.

Нажмите Save с пустым полем, чтобы увидеть ошибку, затем введите имя и сохраните: кнопка 800 мс показывает «Saving...». Нет ни useState для ошибки, ни флага isLoading, ни e.preventDefault().

Actions и действия форм

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

  • startTransition (и useTransition) теперь принимают асинхронную функцию. isPending остаётся true, пока вся функция не закончится.
  • <form action={fn}> вызывает fn с FormData формы при её отправке. Он выполняется как Action, а после его завершения React сбрасывает неконтролируемые поля формы.
  • <button formAction={fn}> даёт одной кнопке отправки собственное действие.
  • useActionState хранит значение, которое действие вернуло последним, поэтому действие может вернуть сообщение об ошибке или сохранённую запись.
  • useFormStatus из react-dom позволяет компоненту внутри формы узнать, отправляется ли эта форма, без передачи пропсов вниз. Ему нужен родительский <form>, поэтому здесь он показан в статическом блоке:
import { useFormStatus } from 'react-dom';

function SubmitButton() {
    const { pending } = useFormStatus();
    return <button disabled={pending}>{pending ? 'Sending...' : 'Send'}</button>;
}

useOptimistic

useOptimistic показывает ожидаемый результат, пока Action ещё выполняется, и возвращается к настоящему состоянию, когда Action заканчивается. Счётчик лайков может увеличиться в момент клика и откатиться, если запрос не удался.

const [optimisticLikes, addOptimisticLike] = useOptimistic(likes, (current, delta) => current + delta);

Страница о useOptimistic содержит запускаемый пример с поддельным API, который намеренно сбоит, чтобы вы видели откат.

API use

use читает значение из промиса или из контекста. С промисом он приостанавливает компонент, пока промис не выполнится, а ближайший <Suspense> тем временем показывает свой запасной вариант. В отличие от всех остальных хуков, use можно вызывать внутри if или цикла и после раннего return.

React 19 также позволяет рендерить <ThemeContext value="dark"> напрямую вместо <ThemeContext.Provider>. Оба появляются в этом примере:

ref как пропс и очистка ref

Функциональный компонент теперь получает ref как любой другой пропс. Больше не нужно оборачивать его в forwardRef, чтобы передать ref к элементу DOM.

Ref-колбэк также может вернуть функцию очистки. React вызывает её, когда элемент уходит с экрана, так же как работает очистка эффекта. Колбэк, который ничего не возвращает, по-прежнему вызывается с null при удалении, как в React 18.

Нажмите кнопку несколько раз и прочитайте консоль: каждое удаление выводит строку очистки, каждое возвращение выводит attached to DIV.

Метаданные документа

<title>, <meta> и <link> можно рендерить в любом месте компонента, и React перенесёт их в <head>. Компонент страницы может задать собственный заголовок без библиотеки вроде react-helmet.

У превью нет вкладки браузера, которую можно показать, поэтому эффект вместо этого выводит document.title. Переключайте статьи, и выводимый заголовок будет следовать за ними.

Таблицы стилей получили то же: <link rel="stylesheet" href="..." precedence="default" /> внутри компонента вставляется в head один раз, в порядке приоритета, и React ждёт его загрузки, прежде чем показать содержимое, которому он нужен. <script async src="...">, отрендеренный несколькими компонентами, загружается только один раз. react-dom также экспортирует preload, preinit, preconnect и prefetchDNS для подсказок о ресурсах.

Activity и useEffectEvent (React 19.2)

<Activity mode="hidden"> скрывает детей, не выбрасывая их состояние. React скрывает DOM, выполняет очистки эффектов и восстанавливает всё, когда режим снова становится "visible". Это подходит для вкладок и панелей, к которым пользователь, скорее всего, вернётся.

Напишите заметку, переключитесь на About и обратно. Текст на месте, а консоль показывает, что эффект был очищен, пока панель была скрыта. Замените обёртку <Activity> на {tab === 'notes' && <Notes />}, и заметка будет теряться при каждом переключении.

useEffectEvent выносит функцию из зависимостей эффекта. Функция всегда видит последние пропсы и состояние, но их изменение не перезапускает эффект:

function ChatRoom({ roomId, theme }) {
    const onConnected = useEffectEvent(() => {
        showNotification('Connected!', theme);
    });

    useEffect(() => {
        const connection = createConnection(roomId);
        connection.on('connected', () => onConnected());
        connection.connect();
        return () => connection.disconnect();
    }, [roomId]); // theme is not a dependency
}

19.2 также добавил cacheSignal для Server Components (он сообщает, когда результат cache() больше не нужен) и Performance Tracks в панели производительности Chrome DevTools. React 19.1 добавил captureOwnerStack, функцию только для разработки, которая возвращает, какие компоненты отрендерили текущий.

Server Components и Server Functions

Server Components это компоненты, которые выполняются заранее на сервере (или во время сборки) и отправляют свой вывод в браузер. Они могут быть async и читать базу данных напрямую, а их код никогда не попадает на клиент. Server Functions (сначала назывались Server Actions) это асинхронные функции, помеченные 'use server', которые клиентский компонент может вызывать как обычную функцию. Обоим нужен фреймворк с бандлером, который их поддерживает, например App Router в Next.js, поэтому в этом редакторе они запуститься не могут.

// A Server Component: async, runs on the server only
export default async function Notes() {
    const notes = await db.notes.findMany();
    return notes.map((note) => <Note key={note.id} note={note} />);
}

// A Server Function, usable as a form action
async function createNote(formData) {
    'use server';
    await db.notes.create({ text: formData.get('text') });
}

Удалённые и изменённые API

React 19 удалил API, которые много лет были устаревшими:

УдаленоЧем заменить
ReactDOM.render, ReactDOM.hydratecreateRoot, hydrateRoot из react-dom/client
unmountComponentAtNoderoot.unmount()
findDOMNoderef на элементе DOM
Строковые рефы (ref="input")useRef или ref-колбэк
Устаревший контекст (contextTypes, getChildContext)createContext со static contextType или use
Проверки propTypes (теперь молча игнорируются)TypeScript или собственные проверки
defaultProps у функциональных компонентовзначения параметров по умолчанию
react-dom/test-utilsact из react; для остального React Testing Library
react-test-renderer/shallowпакет react-shallow-renderer
React.createFactoryJSX

Классовые компоненты сохраняют defaultProps. Ошибки тоже сообщаются иначе: ошибки, пойманные границей ошибок, один раз логируются через console.error, непойманные ошибки уходят в window.reportError, а createRoot принимает опции onCaughtError и onUncaughtError, чтобы сообщать о них самостоятельно.

Обновление до React 19

Сначала обновитесь до React 18.3. Он идентичен 18.2, но предупреждает об устаревших API и других изменениях, которые нужны React 19, поэтому их можно исправить, пока приложение ещё работает. React 19 также требует современного преобразования JSX, которое уже используют Vite и все актуальные фреймворки. Затем установите React 19:

npm install react@^19 react-dom@^19
npm install --save-dev @types/react@^19 @types/react-dom@^19

Официальное руководство по обновлению указывает на codemod для механических изменений. Первый охватывает строковые рефы, импорты act и ReactDOM.render; второй обновляет код TypeScript под новые типы:

npx codemod@latest react/19/migration-recipe
npx types-react-codemod@latest preset-19 ./src

После обновления ничто не заставляет вас переходить на Actions или новые хуки. Существующие компоненты, хуки и классовые компоненты продолжают работать; формы можно переводить на <form action> по одной.

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

Когда вышел React 19?

React 19 стал стабильным в декабре 2024 года. React 19.1 вышел в марте 2025 года, а React 19.2 в октябре 2025 года.

Какие главные изменения в React 19?

Actions (асинхронные функции, которые сами управляют состоянием ожидания, ошибками и формами), хуки useActionState, useOptimistic и use, ref как обычный пропс, <Context> как провайдер и теги <title> и <meta>, которые переезжают в head документа. Server Components стали стабильными для фреймворков.

forwardRef устарел в React 19?

Функциональные компоненты теперь могут принимать ref как обычный пропс, поэтому новому коду forwardRef не нужен. Он по-прежнему работает, а команда React сообщила, что он будет объявлен устаревшим в будущей версии.

Сломает ли React 19 моё приложение на React 18?

В основном через удалённые API: ReactDOM.render, findDOMNode, строковые рефы, устаревший контекст, propTypes и defaultProps у функциональных компонентов. React 19 также требует современного преобразования JSX. Сначала обновитесь до React 18.3, исправьте его предупреждения об устаревании, затем запустите codemod для React 19.

Нужен ли Next.js, чтобы использовать React 19?

Нет. Actions, новые хуки, ref как пропс и метаданные работают в обычном клиентском приложении на Vite. Server Components и Server Functions требуют фреймворка, который их поддерживает, например Next.js.

Иллюстрация языков программирования Coddy

Учитесь программировать с Coddy

НАЧАТЬ