{
  "id": 8948702,
  "title": "React 19's useTransition Looked Simple. Then I Found a Second Bug Hiding Inside the First One",
  "url": "https://urgent.news/2026/09/21/react-19s-usetransition-looked-simple-then-i-found-a-second-bug",
  "topic": "tech",
  "section": "Tech",
  "published": "2026-09-21T15:32:13.000Z",
  "source": {
    "name": "Dev.to",
    "slug": "dev-to",
    "url": "https://dev.to/shubhradev/react-19s-usetransition-looked-simple-then-i-found-a-second-bug-hiding-inside-the-first-one-35dk"
  },
  "original_language": "en",
  "account": "React 19's `useTransition` hook may seem simple at first, but hidden bugs can arise. This guide explains the intricacies of `useTransition`.\n\n`useTransition` returns two values: `isPending` (a boolean) and `startTransition` (a function). `isPending` becomes `true` at the first call to `startTransition` and stays `true` until all actions in the transition complete. `startTransition` takes a single argument - a function to run immediately, with no delay or scheduling. Any updates within that function are marked as low priority and interruptible, rather than urgent.\n\nUnlike `useActionState`, `useTransition` does not return a result value, built-in error state, or queue. The tradeoff is less structure, but also less standing between you and the raw mechanism.\n\nConsider a search filter example: `query` updates synchronously, while `filterQuery` is wrapped in `startTransition`, causing a lag between `query` and `filterQuery`. The actual array iteration still runs synchronously, but the render that follows may be delayed if more urgent updates are occurring.\n\nHowever, `query` cannot be wrapped in `startTransition`, only `filterQuery` can. If you don't control the setter for a controlled input, `useDeferredValue` is a better alternative. The decision to use `useDeferredValue` depends on who owns the `set` function.",
  "summary": "Every hook in this series so far has been a passenger. useActionState rides inside a Transition and reports back the result. useOptimistic rides inside one and shows you a preview before the real answer lands. useFormStatus doesn't even ride, it just reads a status from whoever else is driving. useTransition is the only one of the four that sits in the driver's seat by itself, no form required,…",
  "key_points": [
    "useTransition returns isPending (boolean) and startTransition (function)",
    "isPending becomes true at first startTransition call, stays true until all actions complete",
    "startTransition runs a function immediately, marking updates within as low priority"
  ],
  "editors_take": null,
  "illustration": null,
  "coverage": {
    "outlets": 1,
    "also_reported_by": []
  },
  "ai_generated": true,
  "disclaimer": "Summaries, key points and the editor’s take are written by software from other outlets’ reporting and may contain errors — always check the linked original."
}