如何在React Next JS中延迟加载子对象?

4ioopgfo  于 2023-10-18  发布在  React
关注(0)|答案(1)|浏览(105)

我想知道如何在React Next JS中延迟加载子组件。请参阅下面的代码从布局.tsx文件,这是从Next.js:

import {lazy, Suspense} from "react";
import "./globals.css";
import type { Metadata } from "next";
import { Inter } from "next/font/google";
import Navbar from "./layouts/navbar";
import Footer from "./layouts/footer";
import Loading from "./loading/loading";

const inter = Inter({ subsets: ["latin"] });

export const metadata: Metadata = {
  title: "ID",
  description: "Create your own ID!",
};

export default function RootLayout({
  children,
}: {
  children: React.ReactNode;
}) {
  return (
    <html lang="en">
      <head>
        <link rel="icon" href="/favicon.ico" sizes="any" />
        <link rel="apple-touch-icon" href="/favicon.ico" sizes="any" />
      </head>
      <body className={inter.className}>
        <Navbar />
        <Suspense fallback={<Loading />}>{children}</Suspense>
        <Footer />
      </body>
    </html>
  );
}

正如你在上面的代码中看到的,我导入了lazy和Suspense。
我也有一个加载组件,将用于回退。
我知道如何通过导入组件来使用lazy,而且Next js中的dynamic与lazy的作用相同。
但我想做的是为孩子们使用lazy load,我不知道如何为孩子们使用lazy()函数,我以前从未尝试过。
TBH,甚至不确定是否有可能这样做。
请帮我解决这个问题,非常感谢你的回答和任何建议。
谢谢你!

gxwragnw

gxwragnw1#

在React中,您可以使用React.lazy()函数在需要时动态加载组件。但是,当使用Next.js与服务器端渲染(SSR)时,需要考虑一些注意事项。Next.js有自己的代码拆分和动态导入方式,可能无法直接与React.lazy()一起使用。
在本例中,您希望在RootLayout中延迟加载children组件。您可以通过使用Next.js的动态函数和import()动态加载子组件来实现这一点。你可以这样做:

import { Suspense } from "react";
import dynamic from 'next/dynamic'; // Import the dynamic function
import Loading from "./loading/loading";

const Navbar = dynamic(() => import("./layouts/navbar")); // Lazy load Navbar
const Footer = dynamic(() => import("./layouts/footer")); // Lazy load Footer

export default function RootLayout({
  children,
}: {
  children: React.ReactNode;
}) {
  return (
    <html lang="en">
      <head>
        <link rel="icon" href="/favicon.ico" sizes="any" />
        <link rel="apple-touch-icon" href="/favicon.ico" sizes="any" />
      </head>
      <body>
        <Navbar />
        <Suspense fallback={<Loading />}>
          {children}
        </Suspense>
        <Footer />
      </body>
    </html>
  );
}

在上面的代码中,我们使用了Next.js的动态函数来动态导入导航栏和页脚组件。Next.js会自动分割这些组件的代码,并延迟加载它们。
但是,请注意,在RootLayout中,您不需要为子组件使用React.lazy()或Suspense,因为Next.js会自动处理代码拆分和延迟加载。当使用React.lazy()时,您只需要将子组件 Package 在Suspense中,用于动态导入子组件中的组件。

相关问题