当前位置: 首页 > 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泄露要如何应对
  • 集合多家“最美书店”,松江成立书店联盟“书香满云间”
  • “全国十大考古”揭晓:盘龙城遗址、周原遗址入围
  • 特朗普称或将“大幅降低”对华关税,外交部:打,奉陪到底;谈,大门敞开
  • 中国建设银行原党委委员、副行长章更生严重违纪违法被开除党籍
  • 特朗普特使将赴俄见普京,俄方:美俄间谈判艰难且耗时
  • 广汽全域赋能,领程皮卡概念车重磅登陆上海车展