javascript - zustand next 13 在服务器上设置初始状态并在客户端上获取状态

标签 javascript reactjs next.js zustand

我有接下来的 13 个应用程序,我正在使用 zustand 作为我的状态管理器 现在 我有一个简单的布局,如下所示

<MainProvider>
  <div className="min-h-screen flex flex-col">
    <Navbar></Navbar>
    <main className="layout flex-1 flex flex-col">{children}</main>
    <Footer></Footer>
  </div>
</MainProvider>

对于 MainProvider 组件,它看起来像这样,我计划将所有提供程序放在这里并加载 zustand 存储的初始数据

import React from "react";
import ReactQueryProvider from "./ReactQueryProvider";
import VocabService from "@/services/vocab.service";
import { useVocab } from "@/store";

export type MainProviderProps = {
  children: React.JSX.Element;
};

const getInitialVocab = async () => {
  const [productCategories] = await Promise.all([
    VocabService.getProductCategories(),
  ]);
  useVocab.setState({ productCategories });
};

const MainProvider = ({ children }: MainProviderProps) => {
  getInitialVocab();

  return <ReactQueryProvider>{children}</ReactQueryProvider>;
};

export default MainProvider;

这是服务器组件,正如您在这里看到的那样,我正在设置所有 promise 解析后的状态,并且效果非常好

对于页面组件

"use client";
import { useEffect, useState } from "react";
import Product from "@/components/Product";
import Breadcrumbs from "@/components/elements/Breadcrumbs";
import { useVocab } from "@/store";

const Home = () => {
  const productCategories = useVocab();

  useEffect(() => {
    console.log(useVocab.getState(), new Date().getTime());
    console.log(productCategories);
  }, [productCategories]);

  return (
    <>
      <div className="breadcrumbs bg-gray-200 py-4">
        <div className="container mx-auto">
          <Breadcrumbs
            items={[
              { name: "a", link: "a" },
              { name: "b", link: "b" },
            ]}
          />
        </div>
      </div>

      <div className="page flex-1 bg-red-200">
        <div className="container mx-auto">
          <h1>page</h1>
          <div className="flex">
            <Product
              currency="egp"
              image=""
              name="test"
              price={123}
              rate={1}
              reviews={24}
            ></Product>
          </div>
        </div>
      </div>
    </>
  );
};

export default Home;

它是一个客户端组件,我尝试使用 useVocab.getState 函数加载状态并使用返回值,但客户端上没有任何内容获取初始数据。初始数据位于服务器上,但客户端上没有任何内容

你认为这有什么问题吗?

最佳答案

由于它是一个服务器组件,nextjs 13 强制您在初始化服务器组件上的状态时将服务器状态绑定(bind)到客户端状态。希望这个视频能为您提供更多信息 https://youtu.be/OpMAH2hzKi8?si=BzxxwjNh40c-GggK

关于javascript - zustand next 13 在服务器上设置初始状态并在客户端上获取状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76730251/

相关文章:

javascript - 对提示框应用限制

Javascript 在我的网站中显示日期和时间,使用 UTC 在 javascript 中考虑用户时区

javascript - 如何使用注入(inject)的 JavaScript 将 UIWebView 滚动到一个点

javascript - 无法获取react-hook-form来正确验证电子邮件

javascript - 使用 Javascript 提交表单

reactjs - 弹出窗口中的 React 有什么方法可以与父窗口通信吗?

reactjs - 聚光灯不工作,而半球光和点光在我的代码中工作

javascript - ReactJS 区分来自多个组件的点击。

reactjs - 从 Next JS 中的节点模块导入 css 文件?

node.js - Node/ react 应用程序返回 "SyntaxError: Unexpected token import"错误