You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Next.js SSR水合不匹配问题求助:从localStorage读取值渲染仪表盘侧边栏时出错

Next.js SSR水合不匹配问题求助:从localStorage读取值渲染仪表盘侧边栏时出错

你好呀!我最近在调试仪表盘的侧边栏组件时碰到了个头疼的Next.js问题,折腾半天没捋顺,来求助各位大佬啦🥺

情况是这样的:我想从localStorage里读取用户之前保存的侧边栏配置(比如展开/折叠状态、自定义样式类名),然后用这个值来渲染侧边栏。结果页面一加载就弹出了SSR水合不匹配的错误,具体提示如下:

A tree hydrated but some attributes of the server rendered HTML didn't match the client properties. This won't be patched up. This can happen if a SSR-ed Client Component used:

错误截图如下:
Next.js SSR水合不匹配错误截图

看错误指向的是侧边栏的<aside>元素,应该是服务端渲染的HTML和客户端hydrated后的内容因为localStorage的存在产生了差异。

我试了直接在组件里初始化状态时读取localStorage,结果就触发了这个错误,现在想问问大家有没有靠谱的解决办法?比如怎么让服务端和客户端的初始渲染内容保持一致,或者正确在客户端读取localStorage来更新UI?

另外我也整理了几个自己查到的可能思路,不知道对不对:

  • 用useEffect延迟读取localStorage:因为SSR阶段服务器没有localStorage,在useEffect里读取的话,会等水合完成后再执行,这样服务端先渲染默认状态,客户端再更新成localStorage里的配置
  • 禁用组件的SSR:用动态导入的方式,不让服务端渲染这个侧边栏组件,直接在客户端渲染
  • 统一服务端和客户端的初始值:服务端渲染时用和客户端读取localStorage前一样的默认配置,等客户端读取后再替换成用户配置

有没有大佬能帮忙看看这些思路对不对,或者有没有更合适的方案呀?万分感谢!

火山引擎 最新活动