InquirerWorld Food Day 2026: Can PH celebrate amid hunger?ESPNMan City's alternate universe: Guardiola, Haaland to Arsenal? Arteta to PSG?ESPN DeportesJulián Quiñones, cómo está su lucha por el goleo en ArabiaRTP DesportoFrancisco Cabral com “sensação incrível” antes da final do Masters 1.000 de XangaiThe Jerusalem PostFounder of Indian opposition 'Cockroach Janta Party' group, Dipke, detained ahead of protestDaily MaverickPOLITICALLY AWEH: Drill, Baby, Drill — Who’s reading the fine print at African Energy Week?Bollywood HungamaThe best ending for Drishyam is NO Drishyam 4. Why Ajay Devgn and Abhishek Pathak are RIGHT to end the blockbuster franchiseThe RegisterUncle Scam Wants You … to cough up your cash and personal data, FBI warns ahead of midtermsVarietyKenny Ortega Says His New Lego Friends ‘Heartlake’ Movie Brings the Bricks to Life ‘in the Most Wonderful Musical Capacity’Business AMVerenigde Staten ontwikkelen laserwapen dat op al hun militaire voertuigen pastZDF heuteAktuelle Pressemitteilungen des ZDFBBC عربيالتحالف يعلن اعتراض 4 مسيرات و3 صواريخ وجماعة أنصار الله تقول إنها أسقطت مسيرة سعودية
The Daily Newsstand · Free, Always
Friday, October 16, 2026

React 19.3: что реально поменялось и почему это важно

Translate

Если следить за React только по крупным релизам, легко пропустить момент, когда библиотека тихо меняет направление. React 19.3 — как раз такой случай. Сам релиз вышел 9 сентября 2026 года. И я хочу поделиться парой моментов из этого обновления. Рассмотрим пару хуков это ViewTransition и Fragment Refs. Еще, что я могу выделить, это новые возможности для SSR, Server Components и работы с браузерными API. Самое интересное тут даже не в том, сколько новых API добавили. Просто React постепенно перетягивает на себя задачи, которыми раньше занимался сам разработчик: переходные анимации, работу с несколькими DOM‑узлами без лишних обёрток, нюансы SSR и взаимодействие с браузерными API. Давайте разберем это более по‑подробнее.

ViewTransition: анимации переезжают внутрь React

Одна из самых заметных новинок — стабильный компонент <ViewTransition>. Раньше View Transitions существовали только как эксперимент. Теперь это стабильный API, и анимации можно описывать прямо в React‑компонентах.

import { ViewTransition, useState, startTransition } from 'react';

function App() {
  const [isOpen, setIsOpen] = useState(false);

  const toggle = () => {
    startTransition(() => {
      setIsOpen(value => !value);
    });
  };

  return (
    <>
      <button onClick={toggle}>
        {isOpen ? 'Закрыть' : 'Открыть'}
      </button>

      {isOpen && (
        <ViewTransition>
          <div className="card">
            Контент
          </div>
        </ViewTransition>
      )}
    </>
  );
}

При изменении состояния внутри startTransition, React может сам запускать анимацию для компонента.

Сам React может различать несколько исходов:

  • enter — это когда элемент появился;

  • exit — это когда элемент исчез;

  • update — это когда содержимое или стили изменились;

  • share — это когда один элемент исчез и появился в другом месте.

По дефолту React использует cross‑fade, но также можно задать свои классы и сделать свою CSS‑анимации.

Раньше для таких анимаций мы использовали:

  • CSS transitions или animations

  • framer‑motion;

  • свою систему анимаций;

  • Или ручное управление состояниями в компоненте isVisible или isMounted.

Теперь часть этого выполняется самим React‑ом. Рассмотрим пример:

<ViewTransition>
  <Suspense fallback={<Loading />}>
    <Profile />
  </Suspense>
</ViewTransition>

React также теперь анимирует переход от fallback к самому контенту. Не смотря на это ребята из команды React‑а предупреждают, что лучше использовать анимацию для перехода от загрузки к готовому экрану. То есть в идеале нужно чтобы сам fallback появлялся быстро. Если это рассматривать на практике, то можно сказать, что React начинает лучше связывать рендеринг, загрузку данных и визуальный переход.

Fragment Refs: наконец можно работать с группой DOM‑узлов

Еще одно новововедение это — Freagment Refs.

Возьмем всем нам знакомую ситуацию. Наш компонент должен вернуть несколько элементов разом:

<> 
  <Card />
  <Card />
  <Card />
</>

Ранее, чтобы отслеживать всю группу нам надо было оборачивать всю эту конструкцию в div‑контейнер и вешать на него ref:

<div ref={ref}>
  <Card />
  <Card />
  <Card />
</div>

Как показывает практика, что данный контейнер не всегда нужен. Так как он можем влиять на:

  • CSS;

  • accessibility;

  • размер элементов и компонентов;

  • структуру DOM-дерева.

В React 19.3 же, можно не вешать не на div а напрямую на Fragment. То есть если смотреть на примере:

const ref = useRef(null);
return (
  <Fragment ref={ref}>
    <Card />
    <Card />
    <Card />
  </Fragment>
);

Но при этом сам ref дает на возможность работать и с дочерними DOM‑элементами.

Например:

fragmentRef.current?.focus();

Или можем подключить наблюдателей:

fragmentRef.current?.observeUsing(observer);

Также нам доступны операции с событиями, фокусом, позиционированием и DOM‑структурой. На мой взгляд же, эта штука очень полезна при написании своих UI‑компонентов. Например, мы можем написать компонент InView, который будет отвечать за несколько элементов, лежащих в нем:

<InView>
  <Card />
  <Card />
  <Card />
</InView>

И при этом мы можем не создавать лишний контейнер вокруг элементов. Для небольшого приложения это нововведение может быть вообще не заметно. Но если рассматривать, в каком‑то более‑менее, крупной дизайн‑системе или кастомном UI‑kit, то возможность использовать ее выглядит очень даже практично.

browser(): более явный контроль над SSR

Хочу выделить еще одну штуку. Она касается приложений с серверным рендерингом. Для лучшего понимания, представим компонент, которым пользуется браузерным API:

const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;

На сервере такого окружения нет. Раньше такую ситуацию можно было решить вот так:

const [mounted, setMounted] = useState(false);

useEffect(() => {
  setMounted(true);
}, []);

if (!mounted) {
  return null;
}

Или, например, через проверки:

if (typeof window === 'undefined') {
  return null;
}

В React 19.3 появился отдельный API browser():

import { use } from 'react';
import { browser } from 'react-dom';

function TimeZone() {
  use(browser());
  const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;

  return <p>{timezone}</p>;
}

Этот компонент прямо и говорит React‑у:

«Данный кусок интерфейса имеет смысл только в браузере!»

Уже на сервере он будет приостановлен через Suspense, а далее после гидратации продолжит свою работу на клиенте. Даже эта небольшая деталь, является показательно. Потому что React постепенно дает нам специальные механизмы, которые ранее приходилось решать набором обходных паттернов.

React 19.3 — это вам не «несколько хуков»)

Если посмотреть на все изменения вместе, становиться понятно, куда React развивается. ViewTransition работает с переходами интерфейса. Fragment Refs дают более низкоуровневый контроль над DOM‑элементами без лишнего мусора. browser() помогает понятно описать границу между сервером и браузером. A Server Components получают дополнительные возможности с Context. То есть React постепенно становится не просто либой для декларативного описания UI. Он со временем начинает учитывать все больше аспектов приложения:

  • рендеринг

  • сервер

  • браузер

  • загрузка

  • переходы

  • DOM

  • пользовательский интерфейс

И именно поэтому React 19.3 стал намного интереснее с развитием своей экосистемы.

View the original on Хабр →

KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.