Roadmap › React (with Hooks, React 19 & Next.js basics) › Module: React 19 and Server Components
Lessons in this course (17)
11. Actions, useActionState, useOptimistic and use()
AdvancedMediumLesson 11 of 17
jsx
// Form Actions (React 19): pass a function to <form action>
function AddTodo({ addTodo }) {
const [error, submitAction, isPending] = useActionState(async (prevState, formData) => {
const title = formData.get("title");
if (!title) return "Title is required";
await addTodo(title); // async transition: isPending is true meanwhile
return null;
}, null);
return (
<form action={submitAction}>
<input name="title" />
<button disabled={isPending}>{isPending ? "Saving…" : "Add"}</button>
{error && <p>{error}</p>}
</form>
);
}
// Optimistic UI
const [optimisticLikes, addOptimisticLike] = useOptimistic(likes, (current, delta) => current + delta);
// use(): read a promise (with Suspense) or context, can be conditional
function Comments({ commentsPromise }) {
const comments = use(commentsPromise);
return comments.map(c => <p key={c.id}>{c.text}</p>);
}Also: useFormStatus (pending state for a submit button inside a form), useTransition (mark non-urgent updates), useDeferredValue, document metadata (<title>, <meta> rendered anywhere), <Activity mode="hidden"> (19.2) to keep hidden UI state.