如何在NextJS 13.4中从服务器持久化和设置客户端的全局状态?

cmssoen2  于 2023-05-28  发布在  其他
关注(0)|答案(1)|浏览(386)

问题:例如,在NextJS13中,您的导航栏位于根layout.tsx文件夹中。它检查auth,然后获取用户,你希望用户对所有页面都是全局可用的,无论是服务器组件还是客户端组件,因为Navbar存在于每个路由中,本质上是auth会话的真实来源,当Navbar已经完成工作时,在所有服务器组件上获取用户是不明智的。

xxslljrj

xxslljrj1#

解决方案:https://www.youtube.com/watch?v=OpMAH2hzKi8
使用Zustand,一个不需要上下文 Package 器的全局状态管理系统:https://www.npmjs.com/package/zustand
创建商店

const useUserStore = create((set) => ({
  signedIn: false,
  setSignedIn: (isSignedIn) => set({ isSignedIn }),
}))

创建StoreInitializer.tsx:

"use client";

import { useRef } from "react";
import { useUserStore } from "@/store/userStore";

export function StoreInitializer({ user }: { user?: User }) {
  const isInitialized = useRef(false);

  if (!isInitialized.current) {
    useUserStore.setState({
      user,
    });
    isInitialized.current = true;
  }
  return null;
}

在根布局中

const { user } = await useServerGetAuth(); // ur own auth function
  useUserStore.setState({ user: user });
  return (
    <html lang="en">
      <body
 
      >
        <NextTopLoader />
        <StoreInitializer user={user} />
        <Navbar />
        {children}
        <Footer />
      </body>
    </html>
  );

现在,只要布局成功地在服务器端验证了用户,它就会设置用户。这也将防止默认值 Flink 。

相关问题