Saltar al contenido principal
React

Solución: Error Hydration Mismatch en React / Next.js

¿Error de hidratación en Next.js o React? Causas reales (incluidas las provocadas por IA), solución paso a paso y cómo prevenirlo.

Error: Hydration failed because the initial UI does not match

¿Por qué ocurre?

El HTML generado en el servidor (SSR) no coincide con el HTML que React genera en el cliente. React espera que ambos sean idénticos. Las causas más comunes son: usar `Date.now()` o `Math.random()` en el render, acceder a `window` o `localStorage` sin comprobar el entorno, extensiones del navegador que inyectan HTML, y código generado por IA que mezcla Server Components y Client Components sin las directivas correctas.

Solución paso a paso

Solución rápida — Envuelve el código que depende del cliente:

'use client';
import { useState, useEffect } from 'react';

export function ClientOnly({ children }: { children: React.ReactNode }) { const [mounted, setMounted] = useState(false); useEffect(() => setMounted(true), []); if (!mounted) return null; return <>{children}; }

// Úsalo así:

  

Si el error viene de Date, Math.random u otros valores dinámicos:

// ❌ Esto genera valores diferentes en servidor y cliente
function Greeting() {
  return 

Hora: {new Date().toLocaleTimeString()}

; }

// ✅ Muévelo a un useEffect function Greeting() { const [time, setTime] = useState(''); useEffect(() => { setTime(new Date().toLocaleTimeString()); }, []); return

Hora: {time || 'Cargando...'}

; }

Si el error viene de HTML inválido (muy común con IA):

// ❌ La IA suele generar esto — 

no puede contener

Texto

bloque
más texto

// ✅ Correcto

Texto bloque más texto

Si ocurre con Next.js App Router y Server/Client Components:

// ❌ Importar un Client Component sin 'use client'
// Este archivo ES un server component por defecto
import { useState } from 'react'; // 💥 Error

// ✅ Añade la directiva al principio del archivo 'use client'; import { useState } from 'react';

Si nada funciona — suprime el warning temporalmente para depurar:

// Solo para depuración, NO en producción
{contenidoDinámico}

Cómo evitarlo en el futuro

Nunca uses valores que cambian entre servidor y cliente (Date, Math.random, window, localStorage) directamente en el render — muévelos a useEffect. No anides elementos HTML de forma inválida (<p> dentro de <p>, <div> dentro de <p>). En Next.js App Router, marca con 'use client' cualquier componente que use hooks de React. Revisa el HTML generado por IA: suele mezclar Server y Client Components.

ReactNext.jsError

¿Quieres que una IA te ayude? Genera el prompt perfecto para tu error:

Generador de Prompts

¿Necesitas desarrollo a medida?

Apps web, IA, módulos ERP — cuéntame tu proyecto.