为什么我的布局在 Nextjs 中重新渲染?

问题描述 投票:0回答:2

我在 Nextjs(应用程序路由器)中有一个简单的根布局,它呈现导航栏及其下面的子项。

根布局

import "./globals.css";
import type { Metadata } from "next";
import { Inter } from "next/font/google";
import { Russo_One } from "next/font/google";
import Navbar from "./_components/Navbar";

export const russo = Russo_One({ weight: "400", subsets: ["latin"] });

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

export const metadata: Metadata = {
  title: "Sportly",
  description: "Generated by create next app",
};

export default function RootLayout({
  children,
}: {
  children: React.ReactNode;
}) {
  return (
    <html lang="en">
      <body className={inter.className}>
        <Navbar />
        {children}
      </body>
    </html>
  );
}

在文档中,它指出...

布局是在多个页面之间共享的 UI。在导航上, 布局保留状态,保持交互性,并且不重新渲染。 布局也可以嵌套

所以,我很困惑为什么会发生这种情况。我只是注意到它,因为我导入了 Google 字体并在导航栏中使用了它。但是,当我更改页面时,字体粗细会重置一秒钟,然后重新出现。有人可以帮助我理解为什么会发生这种情况吗?

导航栏组件

import { Link, Typography, Box } from "@mui/material";
import { russo } from "../layout";

export default function Navbar() {
  console.log("navbar rendering...");
  return (
    <nav className="/*STYLES*/">
        <h1 style={{fontWeight: "400" /* STYLES*/}} className={russo.className}>
          SPORTLY
        </h1>
    </nav>
  );
}

html css reactjs next.js
2个回答
0
投票

如果没有 stackblitz 副本或其他东西,很难调试,但我会

  1. 检查是否确实是重新渲染问题。
    https://jsramblings.com/how-to-check-if-your-component-rerendered-and-why/

  2. 如果不是重新渲染,只是js注入css的问题,可以考虑按照这里推荐的方式加载字体:
    https://nextjs.org/blog/next-10-2#automatic-webfont-optimization


0
投票

我在重新渲染共享布局时遇到了同样的问题,并通过使用

Link
中的
next/link
而不是
@mui/material
解决了这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.