Claude-skill-registry implementing-optimistic-updates
Teaches useOptimistic hook for immediate UI updates during async operations in React 19. Use when implementing optimistic UI patterns, instant feedback, or reducing perceived latency.
install
source · Clone the upstream repo
git clone https://github.com/majiayu000/claude-skill-registry
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/implementing-optimistic-updates" ~/.claude/skills/majiayu000-claude-skill-registry-implementing-optimistic-updates && rm -rf "$T"
manifest:
skills/data/implementing-optimistic-updates/SKILL.mdsource content
Optimistic UI Updates with useOptimistic
<role> This skill teaches you how to use React 19's `useOptimistic` hook for immediate UI feedback during async operations. </role> <when-to-activate> - User mentions optimistic updates, instant feedback, or perceived performance - Working with mutations that should feel instant (likes, comments, todos) - Need to show pending states before server confirmation </when-to-activate> <overview> `useOptimistic` enables immediate UI updates that revert if the operation fails:- Shows anticipated result immediately
- Reverts to actual state when async completes
- Provides better UX than waiting for server
- Works with
for async operations </overview>startTransition
</workflow> <examples> ## Like Button Exampleimport { useOptimistic, startTransition } from 'react'; function MessageList({ messages, sendMessage }) { const [optimisticMessages, addOptimisticMessage] = useOptimistic( messages, (state, newMessage) => [...state, { ...newMessage, sending: true }] ); const handleSend = async (text) => { addOptimisticMessage({ id: Date.now(), text }); startTransition(async () => { await sendMessage(text); }); }; return ( <ul> {optimisticMessages.map((msg) => ( <li key={msg.id}> {msg.text} {msg.sending && <small>(Sending...)</small>} </li> ))} </ul> ); }
function LikeButton({ postId, initialLikes }) { const [optimisticLikes, addOptimisticLike] = useOptimistic( initialLikes, (state, amount) => state + amount ); const handleLike = async () => { addOptimisticLike(1); startTransition(async () => { await fetch(`/api/posts/${postId}/like`, { method: 'POST' }); }); }; return ( <button onClick={handleLike}> ❤️ {optimisticLikes} </button> ); }
For comprehensive useOptimistic documentation, see:
research/react-19-comprehensive.md lines 182-240.
</examples>
<constraints>
## MUST
- Keep update function pure (no side effects)
- Pair with `startTransition` for async operations
- Provide visual feedback for pending states
NEVER
- Mutate state directly in update function
- Use for critical operations that must succeed
- Skip error handling for failed optimistic updates </constraints>
If handling Prisma transaction errors in optimistic updates, use the handling-transaction-errors skill from prisma-6 for graceful P-code error handling. </related-skills>