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

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 使用,确实不够“傻瓜式”。但一旦你掌握了客户端条件渲染与状态保护的技巧,这种问题就能快速应对。

http://www.xdnf.cn/news/1463.html

相关文章:

  • 亚信安全与联通数科达成战略合作,成立联信事业部
  • 深入学习Axios:现代前端HTTP请求利器
  • flex修改主轴方向
  • 深入理解指针(2)
  • git提交
  • ctfhub-RCE
  • CDN加速http请求
  • 腾讯秋招面试题:bug生命周期中有哪些状态?
  • rl中,GRPO损失函数详解。
  • 需求质量验证-测试需求
  • GitLab_密钥生成(SSH-key)
  • 思科路由器密码绕过+重置
  • Vue 3中如何封装API请求:提升开发效率的最佳实践
  • Reactor编程模型介绍
  • Vue3 小功能记录:密码的显示与隐藏功能
  • WebXR教学 05 项目3 太空飞船小游戏
  • Synternet数据流正式上线Google Cloud Web3
  • FreeRTOS深度解析:队列集(Queue Sets)的原理与应用
  • Alertmanager的安装和详细使用步骤总结
  • 【锂电池剩余寿命预测】CNN卷积神经网络锂电池剩余寿命预测(Pytorch完整源码和数据)
  • 大模型RAG的召回模式
  • Vite vs Webpack 优势对比
  • 抱佛脚之学SSM六
  • 4.多表查询
  • AI与智能金融服务:如何利用AI分析大数据预测金融市场波动?
  • 获取发起DNS请求的真实进程及请求域名,不是取服务进程svchost.exe,做网络过滤或网络加速用得上。
  • Android 回显
  • 实验二 多线程编程实验
  • 云原生--CNCF-2-五层生态结构(成熟度3层分类,云原生生态5层结构)
  • 前端加密介绍与实战