React 19 Actions: Form Handling, useActionState & useOptimistic

Handling forms in React previously required extensive boilerplate: declaring isLoading, errorMessage, and data with useState, preventing default behavior on submit, and managing async try/catch blocks. React 19 Actions streamline form mutations into simple, native functions.

React 19 Actions and useOptimistic Flow Diagram

Figure 15: Optimistic UI Flow: User Submits ➔ Instant UI Update ➔ Background Server Action ➔ Confirm or Rollback.

Example: Like Button with useOptimistic & useActionState

import React, { useActionState, useOptimistic } from 'react';

// Server Action function
async function updateLikeAction(previousCount, formData) {
  // Simulate network delay to backend server
  await new Promise(res => setTimeout(res, 1000));
  return previousCount + 1;
}

export default function ArticleLikeWidget({ initialLikes }) {
  // 1. useActionState manages confirmed count and pending status
  const [likes, formAction, isPending] = useActionState(updateLikeAction, initialLikes);

  // 2. useOptimistic updates UI immediately without waiting for server!
  const [optimisticLikes, setOptimisticLikes] = useOptimistic(
    likes,
    (current, update) => current + update
  );

  const handleSubmit = async (formData) => {
    // Instantly increment on screen!
    setOptimisticLikes(1);
    // Send request to server
    await formAction(formData);
  };

  return (
    <form action={handleSubmit}>
      <button type="submit" disabled={isPending}>
        ♥ {optimisticLikes} {isPending ? '(Saving...)' : 'Likes'}
      </button>
    </form>
  );
}

Next Step: Full-Stack React with Next.js (SSR & SSG)

Now let us explore full-stack frameworks, SSR, and SSG in React SSR, SSG & Next.js.

Explore Related React JS Tutorials

Accelerate your React mastery by studying these tightly connected core tutorials:

Modern Form Handling →

Action props on HTML form elements.

Concurrent Transitions →

Pending state transitions during async tasks.

Server Actions Integration →

Executing server mutations directly from client forms.

Share Share on Facebook Share on Twitter Share on LinkedIn Pin on Pinterest Share on Stumbleupon Share on Tumblr Share on Reddit Share on Diggit

You may also like this!