Async transitions wired into forms with built-in pending, error, and optimistic state.
01
01
Understand the problem
reactreact-19actionsforms
02
02
Attempt it yourself
Sketch your approach before reading the solution — that's what interviews test.
Stuck? AI Nudge Available
Get a conceptual hint to guide your logic without spoiling the final implementation.
03
03
Study the solution
The solution is waiting
Give it an honest attempt first — then compare your thinking with the full walkthrough.
04
04
Explore the playground snippets
An async Action inside startTransition
Run Playgroundimport { useState, useTransition } from 'react';
function saveToServer(value) {
return new Promise((res, rej) =>
setTimeout(() => (value % 2 === 0 ? res('Saved ' + value) : rej(new Error('Odd numbers rejected'))), 800),
);
}
export default function App() {
const [count, setCount] = useState(0);
const [status, setStatus] = useState('');
const [isPending, startTransition] = useTransition();
function save() {
// An async function inside startTransition IS an Action: pending is tracked.
startTransition(async () => {
try { setStatus(await saveToServer(count)); }
catch (e) { setStatus('Error: ' + e.message); }
});
}
return (
<div style={{ fontFamily: 'sans-serif', padding: 24 }}>
<p>Count: {count}</p>
<button onClick={() => setCount((c) => c + 1)}>+1</button>{' '}
<button onClick={save} disabled={isPending}>{isPending ? 'Saving…' : 'Save (even only)'}</button>
<p>{status}</p>
</div>
);
}05
05
Join the discussion
Discussion (0)
Sign in to join the discussion.
No responses yet. Be the first to share what you think.