Back to results for “State Management”
Next.js › State Management in Next.js Apps

How would you implement optimistic state updates for a feature like a like button, so the interface feels instant while a server action processes the actual update?

Advanced

Answer

You use the useOptimistic hook to immediately show the expected new state, such as an increased like count, right when the user clicks, while the actual server action runs in the background, and React automatically reconciles the optimistic value with the real result once the server action completes or fails.
'use client';
import { useOptimistic } from 'react';

function LikeButton({ likes, onLike }) {
  const [optimisticLikes, addOptimisticLike] = useOptimistic(likes, (state) => state + 1);
  return (
    <button onClick={() => { addOptimisticLike(); onLike(); }}>
      {optimisticLikes} likes
    </button>
  );
}
Real-world example A social media app shows a like count increasing immediately when a user taps the like button, well before the server action finishes saving that like to the database, making the interaction feel instant and responsive.

Common follow-ups: What happens to the optimistic state if the server action ultimately fails?;How does useOptimistic compare to manually managing a temporary loading state?