Next.js 13 – Jotais useHydrateAtoms-Hook führt zu einer Nichtübereinstimmung der Benutzeroberfläche
P粉548512637
P粉548512637 2023-08-29 15:28:26
0
1
660
<p>Arbeiten mit Next.js 13-Projekten unter Verwendung des neuen Anwendungskatalogs und Jotai als globalem Statusmanager. Jetzt versuche ich, den Hook <code>useHydrateAtoms</code> zu verwenden, um den Anfangszustand an meine Atome zu übergeben, wie in der offiziellen Dokumentation gezeigt, aber dies führt zu einem Hydratationsfehler. </p> <p>Das Folgende ist eine vereinfachte Version des derzeit verwendeten Codes, der die von der serverseitigen Komponente empfangenen Daten an die clientseitige Komponente weitergibt, die <code>useHydrateAtoms</code> aufruft und <code> useAtom</ code> Von diesem Atom lesen und schreiben. </p> <h5>Serverkomponente (Seite)</h5> <pre class="brush:php;toolbar:false;">const getData = async () => // ... } Exportieren Sie die standardmäßige asynchrone Funktion Page() { const data = Warten auf getData(); return <ChildComponent initialState={data} />; }</pre> <h5>Client-Komponente</h5> <pre class="brush:php;toolbar:false;">"Client verwenden"; Exportfunktion ChildComponent({ initialState }) { useHydrateAtoms([[myAtom, initialState]]); const [data, setData] = useAtom(myAtom); return <>{data.id}</>; }</pre> <p>Der Fehler verschwindet vollständig, wenn ich die Unterkomponente mit <code>next/dynamic</code> dynamisch importiere und die SSR-Option auf false setze oder den <code>useHydrateAtoms</code>-Hook entferne, aber beides Lösungen verfehlen den Zweck dieser Implementierung. </p> <p>Wie stelle ich meinem Atom mithilfe eines Werts vom Server einen Anfangszustand zur Verfügung, sodass das Atom beim ersten Client-Rendering nicht <code>null</code> ist? </p>
P粉548512637
P粉548512637

Antworte allen(1)
P粉495955986

我发现 useHydrateAtoms 钩子本身并不是问题,它是一个客户端组件,它访问通过 next/dynamic 动态导入的 UI 不同部分的状态 ssr 选项设置为 false。这导致组件显示的值在第一次渲染时发生变化,从而导致 UI 不匹配。

如何修复错误

只需将调用 useHydrateAtoms 的组件移动到组件树的顶部,这将确保所有子组件都将使用正确的值进行渲染。

Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage