当前位置: 首页 > Web前端 > HTML

HydrationfailedbecausetheinitialUIdoesnotmatch...

时间:2023-03-28 12:11:00 HTML

ErrorHydrationfailedbecausetheinitialUIdoesnotmatchwhatwasrenderedontheserver.原因渲染应用程序时预渲染React树(SSR/SSG)与在浏览器中首次渲染期间渲染的React树不同。第一个渲染称为Hydration,这是一个React特性。这可能会导致React树与DOM不同步并导致意外的内容/属性。注意:水化错误的另一个原因是不建议在Nextjs中将div标签包裹在p标签中。如果出现这样的结构,也会导致错误。另外,antd的Typography组件默认是p标签,当用于此时,也可能会出现此类问题。什么是补水?为什么要使用它?服务器端渲染(SSR)被nextjs等框架用来提高性能(LCP和FCP)和用户体验(SEO),它首先在服务器上渲染应用程序。它向用户返回一个完全格式化的HTML文档,但是应用程序是“动态的”,并不是所有的事情都可以用HTML和CSS完成,所以我们告诉React将事件处理程序附加到HTML上以使应用程序具有交互性。这个渲染我们的组件并附加事件处理程序的过程称为“水合作用”。这就像用交互性(JS)“水”浇灌“干燥”的HTML。水合作用后,我们的应用程序变得交互式或“动态”。Hydration和rehydration通常可以互换使用,但在rehydration期间,它会在用户的设备上运行,并构建一幅世界应该是什么样子的图画。然后将其与文档中内置的HTML进行比较。这是一个称为再水化的过程。在再水合中,React假设DOM不会改变。它只是试图适应现有的DOM。当React应用程序重新水合时,它假定DOM结构将匹配。如果没有,那么您就知道会出问题。用大白话来说就是服务端渲染一个dom结构,然后浏览器根据某种状态重新渲染一个dom结构。这时候会出现两种结构融合(再水化)的情况,ssr默认的结构是不变的,但是如果结构发生变化,那么问题就来了!解决方案:exportdefaultfunctionNav(){const[hasMounted,setHasMounted]=React.useState(false);React.useEffect(()=>{setHasMounted(true);},[]);如果(!hasMounted){返回空;}constuser=getUser();{用户?:}解决第二个导出函数UserState(){const{user}=useUser();const[isUserLoggedIn,setIsUserLoggedIn]=useState(false);useEffect(()=>{setIsUserLoggedIn(!!user);},[user]);returnisUserLoggedIn;}import{UserState}from'./userProvider'exportdefaultfunctionNav(){UserState()?:}