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
- Upgrade React to the latest stable/canary — dispatcher-switch bugs around suspense resume get fixed over time.
- Verify only one copy of react/react-reconciler is loaded (npm ls react; bundler aliases).
- 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
- Upgrade React when this appears — dispatcher bugs get patched
- Ensure a single react copy is loaded
- Record React version + trace in your error reporting for issue filings
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
- 558
- The should not be any remaining suspense node children if th
- There should always be an Offscreen Fiber child in a hydrate
- A dehydrated Suspense node should not have a content Fiber.
- Encountered a dehydrated Suspense boundary that was previous
AI-assisted analysis of facebook/react@eafeac097b (2026-08-21).
Data as JSON: /api/errors/e71f0075e1ea0d0d.
Report an issue: GitHub.