facebook/react · error · Error

476

476

Error message

Expected the form instance to be a HostComponent. This is a bug in React.

What it means

startHostTransition is the reconciler entry react-dom uses when a host <form> starts an action transition (form action={fn} submit, or the reset/submit plumbing behind React-controlled forms). Its contract is that the fiber passed in is a host component; a fiber with any other tag violates that contract, and React reports it as an internal bug rather than a user error.

Source

Thrown at packages/react-reconciler/src/ReactFiberHooks.js:3273

              'If this is due to a subscription please re-write it to use React provided hooks. ' +
              'Otherwise concurrent mode guarantees are off the table.',
          );
        }
      }
    }
  }
}

const noop = () => {};

export function startHostTransition<F>(
  formFiber: Fiber,
  pendingState: TransitionStatus,
  action: (F => mixed) | null,
  formData: F,
): void {
  if (formFiber.tag !== HostComponent) {
    throw new Error(
      'Expected the form instance to be a HostComponent. This ' +
        'is a bug in React.',
    );
  }

  const stateHook = ensureFormComponentIsStateful(formFiber);

  const queue: UpdateQueue<
    Thenable<TransitionStatus> | TransitionStatus,
    BasicStateAction<Thenable<TransitionStatus> | TransitionStatus>,
  > = stateHook.queue;

  startHostActionTimer(formFiber);

  startTransition(
    formFiber,
    queue,
    pendingState,

View on GitHub (pinned to eafeac097b)

Solutions

  1. Make react and react-dom resolve to the exact same version (check the lockfile and dedupe)
  2. File an issue with the <form action> repro if versions already match
  3. Audit any custom renderer or library calling startHostTransition/requestFormReset directly
  4. Reproduce on stable React to confirm it is an experimental-integration issue
Defensive patterns

Strategy: try-catch

Try / catch

// Internal invariant on the form-action path: boundary keeps the rest of the app usable
<ErrorBoundary fallback={<PlainFormWithoutAction/>} onError={(e, info) => fileIssueWithVersions(e, info)}>
  <FormWithServerAction />
</ErrorBoundary>

Prevention

When it happens

Trigger: The form-action machinery is invoked with a fiber whose tag is not HostComponent — typically from version-skewed react-dom calling a mismatched reconciler, or a custom renderer/wrapper reaching into requestFormReset/startHostTransition for a non-DOM element.

Common situations: Installing react and react-dom from different releases (or duplicated copies resolving differently); forks/custom renderers reusing form-action internals; experimental builds where the form-action protocol changed between packages.

Related errors


AI-assisted analysis of facebook/react@eafeac097b (2026-08-21). Data as JSON: /api/errors/a9ead1ce97b305a8. Report an issue: GitHub.