javascript 无限悬念加载,同时获取数据服务器端在下一步与应用程序路由器

nc1teljy  于 2024-01-05  发布在  Java
关注(0)|答案(1)|浏览(110)

我有以下问题:当我尝试使用App router在Next中获取一些数据服务器端时,我面临着一个无休止的挂起加载。我认为这一定与数据获取有关,因为当我删除该部分时,组件正确加载。我在这里做错了什么吗?
这是我的服务器端组件:

import Button from "@/components/Button";

interface EmailResetPreviewData {
  existingEmail: string;
  newEmail: string;
}

const getEmailResetPreview = async (emailResetId: string) => {
  const response = await fetch(
    `${process.env.NEXT_PUBLIC_API_BASE_URL}/auth/reset/email/preview/${emailResetId}`,
    {
      method: "GET",
      headers: {
        "Content-Type": "application/json",
      },
    }
  );
  const data: EmailResetPreviewData = await response.json();
  return data;
};

const ResetEmail = async ({
  params,
}: {
  params: {
    emailResetId: string;
  };
}) => {
  const { emailResetId } = params;
  const data = await getEmailResetPreview(emailResetId);

  return (
    <div>
      <h1>Confirm Your New Email</h1>
      <p>
        Your current email is <strong>{data.existingEmail}</strong>.
      </p>
      <p>
        Your new email will be <strong>{data.newEmail}</strong>.
      </p>
      <Button>Change Email</Button>
    </div>
  );
};

export default ResetEmail;

字符串
ResetEmail组件在以下布局中呈现:

<html lang="en">
      <Suspense fallback={<Loading containerSize={150} barWidth={5} />}>
        <AuthProvider>
          <body className={`${comfortaa.className} ${styles.RootLayout}`}>
            <NavigationBar visible={navbBarVisible} />
            <div className={styles.pageContent}>{children}</div>
            <Footer />
          </body>
        </AuthProvider>
      </Suspense>
    </html>

h9a6wy2h

h9a6wy2h1#

我很确定“无休止的挂起加载”与你的API调用没有正确解析有关。你检查了控制台与这个请求相关的信息吗?
除此之外,似乎你试图在你的整个布局(包括你的html的主体)上使用Suspense。尽管这在某些情况下可能有效,但这不是Next打算让你使用Suspense的方式。
如果你想在任何请求仍在加载时显示你的Loading组件,Next 13引入了特殊文件loading.js(Typescript上的.ts或.tsx)。在内部,Next将使用Suspense Package 布局上的子元素,将加载文件内容呈现为后备。
那么,Next希望我们什么时候手动使用Suspense?当您不想在请求加载时停止渲染整个页面,而只是页面的一部分受此影响时。在这种情况下,您可以通过仅将包含请求的可扩展组件 Package 在Suspense组件中来定义自己的Suspense边界,这意味着只有该组件将被替换为回退,直到它完成加载。这就是Next所说的Streaming
有关此问题的更多信息,请参阅文档:https://nextjs.org/docs/app/building-your-application/routing/loading-ui-and-streaming

相关问题