Skip to main content
React5 min read2026-03-01

React Hydration Error: Text Content Does Not Match

Fix 'Hydration failed because the initial UI does not match what was rendered on the server' in SSR React.

Error Code / Stack Trace

Error: Hydration failed because the server-rendered HTML didn't match the client.

Problem Overview

In Server-Side Rendered (SSR) React, the HTML generated on the server differs from the virtual DOM tree generated during client hydration.

Why Does This Happen?

  • Rendering browser-only APIs like window.innerWidth, localStorage, or Date.now() directly in JSX.
  • Invalid HTML nesting (e.g., putting a <p> inside another <p>, or a <div> inside a <p>).
  • Browser extensions (like password managers or translators) modifying DOM before React hydrates.

Step-by-Step Solution

Step 1: Defer client-specific values until mounted

Use a useEffect mounted state pattern to ensure client-only data is rendered after hydration completes.

tsx
"use client";
import { useState, useEffect } from "react";

export default function ClientClock() {
  const [mounted, setMounted] = useState(false);

  useEffect(() => {
    setMounted(true);
  }, []);

  if (!mounted) return null;

  return <div>{new Date().toLocaleTimeString()}</div>;
}

Step 2: Suppress hydration warning for inevitable dynamic timestamps

Use suppressHydrationWarning on elements where minor text variations are acceptable.

tsx
<span suppressHydrationWarning>{new Date().getFullYear()}</span>

Common Mistakes to Avoid

  • Placing interactive buttons or block elements inside <p> tags, which browser HTML parsers automatically split.

Prevention & Best Practices

  • Always validate your HTML structure using semantic HTML standards.

Frequently Asked Questions

Does a hydration error crash the entire React application?

In development React displays a clear overlay. In production, React discards the server HTML and performs a complete client-side re-render, degrading performance.