Milind Daraniya

React 19.3: View Transitions, Fragment Refs, Trusted Types, and the New Developer Experience

Published September 12th, 2026 16 min read

React keeps changing in small and large ways.

Sometimes a new version gives us a few new APIs.

Sometimes it changes how we build applications.

React 19.3 is interesting because it does a little of both.

React 19.3 was released on September 9, 2026, and the React team made View Transitions and Fragment Refs stable in this release. It also adds new React DOM features such as browser and Trusted Types support, along with an improvement for using Context from Server Components.

For developers building modern React applications, these changes are worth understanding.

React 19.3 is more than a normal update

When upgrading React, I normally don't look only at the version number.

I look at what problem the new version is trying to solve.

React 19.3 focuses on some practical areas:

Animations
DOM interaction
Server rendering
Security
Developer experience
Concurrent updates

The goal is not to make every application look different.

It is to give developers better ways to handle common problems without adding another large library to the project.

View Transitions are now stable

This is probably the most visible feature in React 19.3.

React now provides:

import { ViewTransition } from 'react';

and we can wrap UI that should animate during a transition.

For example:

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

function App() {
    const [show, setShow] = useState(false);

    function toggle() {
        startTransition(() => {
            setShow(value => !value);
        });
    }

    return (
        <>
            <button onClick={toggle}>
                Toggle
            </button>

            {show && (
                <ViewTransition>
                    <div className="card">
                        Product Details
                    </div>
                </ViewTransition>
            )}
        </>
    );
}

React can animate the element when it enters, exits, moves or changes.

The React team describes four main transition types:

enter
exit
update
share

This uses the browser's View Transition API instead of requiring a separate animation library for the basic transition.

Why this is useful

Before this, a developer might add a library just to get a simple page or component transition.

For example:

React
+
Animation library
+
Extra configuration
+
CSS

Now React can work directly with the browser's View Transition API.

That does not mean animation libraries are no longer useful.

There are still many cases where a dedicated animation library makes sense.

But for normal UI transitions, the built-in approach can reduce the amount of code we need.

A practical example

Imagine a product list.

The user clicks a product:

Product List
      ↓
Product Details

Without a transition, the UI can suddenly change.

With a View Transition, React can coordinate the visual change.

This can make applications such as:

E-commerce
Admin panels
Dashboards
Booking systems
CRM
ERP
Content management

feel smoother.

The important thing is not to animate everything.

Too many animations can make an application slower to understand.

I prefer using transitions where they explain a UI change.

View Transitions also work with Suspense

This is another interesting part.

React 19.3 allows View Transitions to work with Suspense.

For example:

<ViewTransition update="auto" default="none">
    <Suspense fallback={<Loading />}>
        <ProductDetails />
    </Suspense>
</ViewTransition>

When the suspended content becomes available, React can animate the transition from the fallback to the final UI.

This can be useful when loading:

API data
Images
Fonts
Lazy components

But I would use this carefully.

A loading indicator that appears immediately usually should not have a slow entrance animation.

The React team also recommends using Suspense animations selectively so cached content does not feel slower than it really is.

Fragment Refs solve a different problem

The second major feature is Fragment Refs.

This is useful when a component renders multiple DOM elements but we don't want to add an unnecessary wrapper element.

For example:

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

A normal ref points to one DOM element.

But sometimes we want to interact with the whole group.

In React 19.3:

import { Fragment, useRef } from 'react';

function ProductList({ products }) {
    const fragmentRef = useRef(null);

    return (
        <Fragment ref={fragmentRef}>
            {products.map(product => (
                <ProductCard
                    key={product.id}
                    product={product}
                />
            ))}
        </Fragment>
    );
}

The ref points to a FragmentInstance.

React provides methods for things such as:

focus
blur
event listeners
IntersectionObserver
ResizeObserver
scrollIntoView
DOM measurement

The important part is that we can work with the group without adding another DOM wrapper.

Why avoiding wrapper elements matters

Sometimes developers add:

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

only because they need a ref.

That extra div can affect:

CSS
Flexbox
Grid
Accessibility
Layout
DOM structure

Fragment Refs give us another option.

This can be especially useful for reusable UI components where we don't control every child component.

An interesting use case: visibility

Imagine an InView component.

We want to know when a group of cards enters the viewport.

With a normal ref, we may need a wrapper.

With Fragment Refs, the group can be observed without changing the DOM structure.

For example, React's documentation demonstrates using IntersectionObserver through a Fragment Ref to build an InView pattern.

This can be useful for:

Lazy loading
Analytics
Animations
Infinite scrolling
Visibility tracking
Dashboard widgets

The new browser() API

React 19.3 also adds a React DOM API called:

browser()

This is mainly useful for server-rendered applications.

There are cases where a component depends on a browser-only value.

For example:

localStorage
Browser timezone
window
Browser APIs

That component may not be able to produce useful HTML on the server.

Previously developers often used patterns such as:

typeof window !== 'undefined'

or:

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

React 19.3 gives this use case a first-class API.

For example:

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

function TimeZone() {
    use(browser());

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

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

On the server, this suspends to the nearest Suspense boundary.

On the client, it continues rendering normally.

This gives server-rendered applications a cleaner way to handle components that only make sense in the browser.

Trusted Types support

Security is another important part of React 19.3.

React now integrates with the browser's Trusted Types API.

Trusted Types is designed to help protect applications against certain DOM-based XSS problems by requiring safe typed values for DOM injection sinks when the site's Content Security Policy enables Trusted Types.

For example, applications can use a policy such as:

Content-Security-Policy:
require-trusted-types-for 'script'

This matters more for applications with strict security requirements.

Large applications often have:

HTML rendering
Rich text
Third-party integrations
User generated content
Dynamic URLs
Server rendered HTML

Security should not be added only after an attack or audit.

It should be part of the architecture.

React 19.3 improves compatibility with Trusted Types values instead of converting them into ordinary strings before passing them to DOM APIs.

Server Components also get a small improvement

React 19.3 also makes it possible for Server Components to render a Context imported from a 'use client' module directly.

Previously, a small wrapper provider was often required.

For example:

'use client';

import { createContext } from 'react';

export const UserContext = createContext(null);

A Server Component can now render:

import { UserContext } from './user-context';

export async function Layout({ children }) {
    const currentUser = await getCurrentUser();

    return (
        <UserContext value={currentUser}>
            {children}
        </UserContext>
    );
}

This is a small change, but it can remove unnecessary wrapper components in applications using Server Components.

React 19.3 also improves transitions

React's changelog includes an important rendering change.

Transitions can now render independently instead of being unnecessarily entangled into one render.

The React team notes that a slow transition no longer needs to hold up unrelated transitions.

This matters because modern applications can have multiple things happening at the same time.

For example:

Search update
     +
Sidebar update
     +
Background data loading
     +
Navigation

These should not always block one another.

React's concurrent architecture is designed around this type of work.

There are also bug fixes

A React release is not only about new APIs.

React 19.3 includes many bug fixes across:

Suspense
Activity
Fast Refresh
Forms
Hydration
React DOM
Server Components
View Transitions

For example, the release includes fixes for View Transition crashes in Mobile Safari and issues related to hydration and Suspense.

This is another reason I prefer checking the complete release notes instead of only reading the headline features.

Should an existing project move to React 19.3?

I would test it before upgrading production.

The process can be simple:

npm install react@19.3.0 react-dom@19.3.0

Then:

npm run build

and:

npm run test

Also check:

ESLint
TypeScript
React Router
Next.js
Vite
Testing libraries
UI libraries
Third-party packages

The React package itself is currently published as version 19.3.0 on npm.

For a small application, the upgrade may be simple.

For a large production application, I would use a separate branch and test the important workflows before merging.

Don't add every new feature immediately

A new React API does not automatically mean every project needs it.

For example, I would not add:

<ViewTransition>

to every component.

I would first identify where a transition actually improves the user experience.

The same applies to Fragment Refs.

If a normal ref on a normal DOM element solves the problem, there is no reason to make the code more complicated.

New APIs should solve real problems.

What I find most interesting

For me, the interesting thing about React 19.3 is that the features are focused on real application problems.

View Transitions
        ↓
Better UI transitions

Fragment Refs
        ↓
Better DOM control

browser()
        ↓
Cleaner browser-only rendering

Trusted Types
        ↓
Better security integration

Context in Server Components
        ↓
Less unnecessary wrapper code

These are not features that require developers to completely change how they write React.

They give us better options when an application becomes more advanced.

My upgrade checklist

For an existing React application, I would check:

✓ Upgrade React and React DOM
✓ Check TypeScript compatibility
✓ Run production build
✓ Run unit and integration tests
✓ Test routing
✓ Test forms
✓ Test SSR if used
✓ Test Suspense
✓ Test third-party UI libraries
✓ Test browser-specific components
✓ Check console warnings
✓ Test production deployment

I would especially test applications that use Server Components because rendering behaviour matters more there.

Final thoughts

React 19.3 is an interesting release because it improves several areas that frontend developers deal with every day.

Animations no longer always need another library.

Groups of DOM elements can be controlled through Fragment Refs.

Browser-only components have a dedicated browser() API.

Trusted Types integration is better for applications with stronger security requirements.

Server Components also get some cleaner Context handling.

The important thing for me is not:

"React 19.3 has many new features."

It is:

"React is giving developers better built-in solutions
for problems that used to require more custom code."

For a new project, these APIs are worth learning.

For an existing application, I would upgrade carefully and test the areas that matter to that particular project.

React 19.3 is not about rewriting your entire application.

It is about having better tools when you need them.