Blog
2 min read

React 19.3: View Transitions, Fragment Refs and browser() Are Stable

React 19.3 (9 September 2026) makes View Transitions stable with the <ViewTransition> component and addTransitionType, adds Fragment Refs for working with groups of DOM nodes without wrappers, introduces react-dom's browser() for client-only rendering, and adds Trusted Types support. Examples and what changes for your app.

The React team released React 19.3 on 9 September 2026. It's also the React version bundled with Next.js 16.4. (What Is React?)

View Transitions (stable)

The <ViewTransition> component animates elements as they enter, exit, move or resize, using the browser's View Transition API:

import { ViewTransition, startTransition, addTransitionType } from 'react'

{isShowing && (
  <ViewTransition>
    <Panel />
  </ViewTransition>
)}

Updates must be marked as Transitions to animate — urgent updates aren't. addTransitionType tags why a transition happened, so the same change can animate differently:

startTransition(() => {
  addTransitionType('next')
  setSlide(s => s + 1)
})
// <ViewTransition enter={{ next: 'from-right', previous: 'from-left' }}>

It also integrates with Suspense, so you can animate only the fallback-to-content swap. It currently works in the DOM only.

Fragment Refs

A ref on <Fragment> gives you a FragmentInstance for a group of sibling DOM nodes — no wrapper <div>, and no need for child components to forward refs. It supports addEventListener, focus, scrollIntoView and observeUsing (for IntersectionObserver and friends):

const ref = useRef(null)
useEffect(() => { ref.current.focus() }, [])

return (
  <Fragment ref={ref}>
    {items.map(item => <Row key={item.id} item={item} />)}
  </Fragment>
)

browser(): render only on the client

use(browser()) from react-dom suspends during server rendering — so the Suspense fallback goes into the HTML — and doesn't suspend on the client after hydration. It's a clean fix for components that depend on browser-only information, like time zones or localStorage, which otherwise cause hydration mismatches:

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

function LocalTime() {
  use(browser())
  return <p>{new Intl.DateTimeFormat().resolvedOptions().timeZone}</p>
}

(Next.js Hydration Error, window is not defined)

Other additions

  • Trusted Types support — React passes values to DOM APIs without string coercion, so strict Trusted Types policies work. (Content Security Policy)
  • Context can be rendered directly as <UserContext value={...}> from a 'use client' module in Server Components setups.
  • onFullscreenChange/onFullscreenError events and many bug fixes.

Upgrade

npm install react@^19.3.0 react-dom@^19.3.0

The release post lists no breaking changes. Next.js 16.4 ships it for you. (Next.js 16.4)

Source: React 19.3 announcement


EasySpawn gives Claude Code a running copy of your app on a persistent server, so it can adopt features like View Transitions and check them in a real browser before you merge. See how it works or join the waitlist.

Related: React useActionState and useOptimistic · React Server Components Explained · React useEffect Explained · What Is JSX?

Keep reading