facebook/react · error · Error

467

467

Error message

Update hook called on initial render. This is likely a bug in React. Please file an issue.

What it means

Internal invariant in updateWorkInProgressHook: the update-path dispatcher ran while `currentlyRenderingFiber.alternate === null` (no committed previous render). Per the adjacent comment, this can be reached when a component suspends, resumes, and then renders an additional hook — React should have switched to the mount dispatcher first, so hitting this throw is a React bug.

Source

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

    nextWorkInProgressHook = workInProgressHook.next;
  }

  if (nextWorkInProgressHook !== null) {
    // There's already a work-in-progress. Reuse it.
    workInProgressHook = nextWorkInProgressHook;
    nextWorkInProgressHook = workInProgressHook.next;

    currentHook = nextCurrentHook;
  } else {
    // Clone from the current hook.

    if (nextCurrentHook === null) {
      const currentFiber = currentlyRenderingFiber.alternate;
      if (currentFiber === null) {
        // This is the initial render. This branch is reached when the component
        // suspends, resumes, then renders an additional hook.
        // Should never be reached because we should switch to the mount dispatcher first.
        throw new Error(
          'Update hook called on initial render. This is likely a bug in React. Please file an issue.',
        );
      } else {
        // This is an update. We should always have a current hook.
        throw new Error('Rendered more hooks than during the previous render.');
      }
    }

    currentHook = nextCurrentHook;

    const newHook: Hook = {
      memoizedState: currentHook.memoizedState,

      baseState: currentHook.baseState,
      baseQueue: currentHook.baseQueue,
      queue: currentHook.queue,

      next: null,

View on GitHub (pinned to eafeac097b)

Solutions

  1. Upgrade React to the latest stable/canary — dispatcher-switch bugs around suspense resume get fixed over time.
  2. Verify only one copy of react/react-reconciler is loaded (npm ls react; bundler aliases).
  3. Reproduce minimally and file an issue at https://github.com/facebook/react/issues.
Defensive patterns

Strategy: try-catch

Validate before calling

// Rule out the environment cause up front
import React from 'react';
import ReactDOM from 'react-dom';
if (React.version !== ReactDOM.version) throw new Error('mismatch');

Try / catch

// Report-only containment; the fix is upstream
class InvariantBoundary extends React.Component {
  componentDidCatch(err) {
    if (err.message.includes('Update hook called on initial render')) {
      reportReactIssue({err, version: React.version});
    }
    throw err;
  }
  render() { return this.props.children; }
}

Prevention

When it happens

Trigger: The update dispatcher consumes a hook on a fiber with no alternate — a suspend/resume sequence that failed to switch dispatchers back to the mount path, or dispatcher state corrupted by mismatched React copies.

Common situations: Rare; reported with use()/suspense resume flows on canary builds, or bundles mixing react-reconciler versions. Not something application code can reach by normal misuse.

Related errors


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