MQ
QURASHI
Blog
MQ
MOHAMED QURASHI

© 2026 Mohamed Qurashi. All rights reserved.

Built with precisionDesigned for impactPowered by innovation
MQ
QURASHI
Blog
Back to Blog
Web Development

React 19: New Features - useOptimistic, use() Hook & Actions

Mohamed Qurashi
April 7, 2026
7 min read
React 19: New Features - useOptimistic, use() Hook & Actions

Share

TwitterFacebookLinkedIn

Tags

React 19UseOptimisticUse() hookState management

# React 19: What's New — useOptimistic, use() Hook & Actions


A client asked me something I couldn't immediately answer last week. That pushed me to dig deeper into ReactJS. They were curious about the updates in React 19, especially how the new `useOptimistic` and `use()` hook could streamline their application's state management. Diving into these features revealed not only their potential but also how they can elevate our code quality and user experience.


Why This Matters (and Why I Care)


As a developer at Beyin Digital, I've always believed in staying ahead of the curve. React 19's new features, like `useOptimistic` and the `use()` hook, are significant developments that reflect the community's push toward more efficient state management and simplicity in handling asynchronous operations. In today's fast-paced digital landscape, optimizing performance and responsiveness is crucial, especially for applications dealing with real-time data.


These updates aren't just theoretical; they've led to tangible improvements in real projects. I've seen how `useOptimistic` can preemptively update the UI, sharpening user experience and reducing frustrations during interactions. Understanding these innovations allows me to provide better solutions to clients and maintain a competitive edge in Abu Dhabi's growing tech scene.


The Basics You Actually Need


Let’s get into the nuts and bolts of what makes React 19 unique. The standout features, `useOptimistic` and the `use()` hook, are designed to optimize state management and asynchronous rendering.


useOptimistic


`useOptimistic` provides a way to optimistically update the component state during async actions. Here's a quick example of how it can be implemented in TypeScript:


import { useOptimistic } from 'react';


type TodoItem = {

id: number;

title: string;

completed: boolean;

};


const TodoList = () => {

const [todos, setTodos] = useOptimistic<TodoItem[]>([], async (newTodo) => {

// Simulate an API call and return the new Todo

return await api.addTodo(newTodo);

});


const handleAddTodo = async (title: string) => {

const newTodo = { id: Date.now(), title, completed: false };

setTodos((prev) => [...prev, newTodo]);

};


// Render todos...

};


use() Hook


The `use()` hook simplifies how we work with asynchronous data. Instead of managing loading states manually, you can streamline your code:


import { use } from 'react';


const TodoFetcher = () => {

const todos = use(fetchTodos());


// Render Todos...

};


How I Build With It (Step by Step)


Now, let’s walk through implementing these features in a practical context. Imagine we are building a simple todo app where users can add and remove tasks, all while keeping the async processes seamless.


1. **Setting Up Your API:** We use a mock API to simulate fetching and adding todos.


const api = {

async fetchTodos() {

// Simulate fetching from a server

return new Promise<TodoItem[]>((resolve) => {

setTimeout(() => resolve([{ id: 1, title: 'Learn React 19', completed: false }]), 1000);

});

},

async addTodo(newTodo: TodoItem) {

// Simulate adding a todo to a server

return new Promise<TodoItem>((resolve) => {

setTimeout(() => resolve(newTodo), 500);

});

},

};


2. **Creating The Todo App Component:** We will utilize `useOptimistic` for adding new todos and `use()` for fetching them:


import React from 'react';


const TodoApp = () => {

const todos = use(api.fetchTodos());

const [currentlyAdded, setCurrentlyAdded] = useOptimistic<TodoItem | null>(null, async (newTodo) => {

return await api.addTodo(newTodo);

});


const handleAddTodo = (title: string) => {

const newTodo = { id: Math.random(), title, completed: false };

setCurrentlyAdded(newTodo);

};


return (

<div>

<h1>Todo List</h1>

{todos.map(todo => (

<div key={todo.id}>{todo.title}</div>

))}

<button onClick={() => handleAddTodo('New Todo!')}>Add Todo</button>

{currentlyAdded && <div>Currently adding: {currentlyAdded.title}</div>}

</div>

);

};


3. **Handling Errors and Optimistic UI Updates:** When using `useOptimistic`, we must ensure we handle errors gracefully:


const handleAddTodo = async (title: string) => {

try {

const newTodo = { id: Math.random(), title, completed: false };

const result = await api.addTodo(newTodo);

setCurrentlyAdded(result);

} catch (error) {

// Handle error...

console.error('Error adding todo', error);

}

};


Mistakes I Made (So You Don't Have To)


1. **Assuming Async Calls are Instant:** I initially thought that using `useOptimistic` would always lead to instant UI updates. However, I learned that we must handle potential failures carefully.


2. **Overlooking Error Handling:** In early implementations, I skipped comprehensive error handling, leaving users frustrated. Ensure you manage errors effectively to improve user experience.


3. **Ignoring TypeScript Strict Mode:** Initially, I didn’t set strict mode, leading to type mismatches. With TypeScript's strict mode, it’s easier to catch potential issues early.


Advanced Tips From Production


1. **Combine `useOptimistic` with Batch Updates:** Instead of handling each state update in isolation, consider batching updates to enhance performance and user experience.


2. **Leverage Suspense for Loading States:** Use React’s Suspense feature alongside the `use()` hook. This provides a better user experience during data fetching by combining loading and error states.


3. **Create a Custom Hook:** For repeated logic involving optimistic updates, consider encapsulating it in a custom hook. This will adhere to DRY principles and streamline your components.


My Honest Take


React 19 is a game-changer in terms of state and async handling with its innovative features like `useOptimistic` and `use()` hook. These improvements align with our goal at Beyin Digital: to build performant and responsive applications.


Incorporating these tools not only makes coding cleaner but significantly enhances user experiences. For anyone working with React, especially into 2025 and beyond, understanding and utilizing these features will be essential. The investment in learning them today will undoubtedly pay off in your future projects.


---

*Mohamed Qurashi | Full-Stack Developer at Beyin Digital | [https://qurashi.dev](https://qurashi.dev)*


---

**Further reading:**

  • [React 19: What's New — useOptimistic, use() Hook & Actions](https://dev.to/react/react-19-whats-new-useoptimistic-use-hook-actions-5b0j)
  • [What’s New in React 19: useOptimistic, use() Hook & Actions](https://blog.logrocket.com/whats-new-in-react-19-useoptimistic-use-hook-actions/)

  • **Related articles on this blog:**

  • [react 18 overview](/blog/react-18-overview)
  • [optimistic ui updates](/blog/optimistic-ui-updates)

  • Related Articles

    Next.js 15 Complete Guide: App Router & Server Components
    Web Development

    Next.js 15 Complete Guide: App Router & Server Components

    A practical, production-tested guide to Next.js 15 App Router and Server Components. Learn how to cut JavaScript bundles by 40% with real patterns from Beyin Digital.

    App vs Web in Next.js: Why I Finally Switched After 5 Years
    Web Development

    App vs Web in Next.js: Why I Finally Switched After 5 Years

    Discover the real differences between App Router and Pages Router in Next.js. Learn when to use each based on production experience from an SEO specialist in Dubai.