对于所有页面,useEffect的主(全局)文件是什么?在Next.js之前,您可以在_app.tsx中使用useEffect,这将影响所有页面.示例:

const MyApp = ({ Component, pageProps }: AppProps) => {
  useEffect(() => {
     console.log("Hello!")
   )}

  return (
    <>
      <Head>
        <title>Title</title>
      </Head>

    </>
  );
}; 

在所有页面上,你都可以看到console.log.现在将Next.js与app目录一起使用,在哪个文件中可以使用全局useEffect?因为您不能在服务器文件中使用useEffect,例如在layout.tsx中.

推荐答案

正如您在Upgrade Guide上看到的,pages/_app.jspages/_document.js已经被单个app/layout.js根布局所取代.

所以你可以把你的useEffect放在app/layout.js中,把它变成一个客户端组件,"use client"在顶部(知道这不会阻止应用的其他部分成为服务器组件):

// app/layout.js

"use client";

export default function RootLayout({ children }) {
  
  useEffect(() => {
     console.log("Hello!")
  }, []);

  return (
    <html lang="en">
      <body>
        {children}
      </body>
    </html>
  );
}

但是,假设您不希望您的根布局成为客户端组件,则可以执行以下操作,例如,使用单独的组件:

// SomeGlobalComponent.js

"use client";

export default function SomeGlobalComponent() {
  useEffect(() => {
     console.log("Hello!")
  }, []);

  return <></>;
}

// app/layout.js

import SomeGlobalComponent from "./SomeGlobalComponent";

export default function RootLayout({ children }) {
  return (
    <html lang="en">
      <body>
        <SomeGlobalComponent />
        {children}
      </body>
    </html>
  );
}

Reactjs相关问答推荐

InfiniteScroll持续获取数据,直到超过最大更新深度

全局上下文挂钩-替代不起作用

两条react 路由的行为不同.有没有人能解释一下,我已经找了好几天了

使用筛选器的Primereact DataTable服务器端分页?

如何在与AntD的react 中限制文件上传和显示消息?

如何通过reactjs正确显示记录

未处理的拒绝 (TypeError):无法读取未定义的属性(读取协议)

在 React-Select 中显示多值的倒序

如何到达类组件中的状态?

如何实现 redux 工具包来注册用户?

Next.js i18n 路由不适用于动态路由

React - 使用 React 显示错误和积极alert

作为单个变量的 React 组件是否比 memoized 组件渲染得更快?

更新和删除功能不工作 Asp.net MVC React

刷新页面时状态改变问题

React Router v6 - 访问嵌套路由和处理手写 url 的正确方法

如何使用react 路由将 url 参数限制为一组特定的值?

使用 yarn 编译 protobuf js 时出现错误pbjs: command not found

在状态中存储多个选定的选项

调用函数以获取数据并在数据到达时导航到链接