当前位置: 首页 > news >正文

React SSR + Redux 导致的 Hydration 报错踩坑记录与修复方案

一条“Hydration failed”的错误,让我损失了半天时间
在这里插入图片描述

背景

我在用 Next.js App Router + Redux 开发一个任务管理应用,一切顺利,直到打开了 SSR(服务端渲染),突然看到这个令人头皮发麻的报错:

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

报错定位在 <Header />,但实际问题比看上去复杂得多。


问题原因

React SSR 会先在服务端输出 HTML,再在浏览器执行 hydration,如果服务端和客户端渲染的 DOM 结构不一致,就会报错。

Redux 的状态通常在客户端初始化,比如 auth.isAuthenticated,在 SSR 阶段它通常是 false,但客户端可能已经是 true

举个例子:

{isAuthenticated ? (<span>欢迎,{user?.username}</span>
) : (<Link href=\"/login\">登录</Link>
)}

服务端输出:

<a href=\"/login\">登录</a>

客户端切换成:

<span>欢迎,Luke</span>

标签类型完全不一样,React hydration 直接炸了。


修复方式:引入 useIsClient
import { useEffect, useState } from 'react';export function useIsClient() {const [isClient, setIsClient] = useState(false);useEffect(() => setIsClient(true), []);return isClient;
}

然后在你的组件中:

const isClient = useIsClient();if (!isClient) return null; // 跳过 SSR 阶段return isAuthenticated ? (<span>欢迎,{user?.username}</span>
) : (<Link href=\"/login\">登录</Link>
);

这样 React SSR 阶段就不会渲染出错误结构,hydration 就能成功。


更进一步:封装 ClientOnly 组件
function ClientOnly({ children }: { children: React.ReactNode }) {const isClient = useIsClient();if (!isClient) return null;return <>{children}</>;
}

任何你想跳过 SSR 的组件,只需要这样写:

<ClientOnly><Header />
</ClientOnly>

结语

React SSR + Redux 状态管理配合 App Router 使用,确实不够“傻瓜式”。但一旦你掌握了客户端条件渲染与状态保护的技巧,这种问题就能快速应对。

相关文章:

  • 【leetcode】3524 求出数组的X值1
  • jspm基于Java的电影购票系统的设计与实现(源码+lw+部署文档+讲解),源码可白嫖!
  • 网络安全技能大赛B模块赛题解析Server12环境
  • Spring Boot + MyBatis 动态字段更新方法
  • 电商系统分库分表详细规划方案
  • 科技项目必须进行验收测试吗?项目验收测试服务机构有哪些?
  • Shell编程之函数和数组
  • Vue3:component(组件:uniapp版本)
  • gem5教程第五章 了解gem5默认配置脚本
  • Vue3父子组件数据同步方法
  • AtCoder Beginner Contest 402题解
  • 云原生--CNCF-3-核心工具介绍(容器和编排、服务网格和通信、监控和日志、运行时和资源管理,安全和存储、CI/CD等)
  • 华为开发岗暑期实习笔试(2025年4月16日)
  • 配置kafka与spark连接
  • Unity导入GLB模型 需要用到这个插件
  • 基于CBOW模型的神经网络词向量转换原理与实践
  • 音视频小白系统入门课-4
  • leetcode-位运算
  • 搭建TypeScript单元测试环境
  • JWT的token泄露要如何应对
  • 农行一季度净利润719亿元增2.2%,不良率微降至1.28%
  • 外交部:美方应在平等、尊重和互惠的基础上同中方开展对话
  • 观察|英国航母再次部署印太,“高桅行动”也是“高危行动”
  • 柴德赓、纪庸与叫歇碑
  • 酒店就“保洁员调包住客港币”致歉,称希望尽早达成解决方案
  • 上海质子重离子医院已收治8000例患者,基本覆盖国内常见恶性肿瘤