Что такое глобальный файл для добавления логики для всех страниц в каталоге приложений Next.js?

Какой основной (глобальный) файл для useEffect для всех страниц? Раньше в Next.js вы могли использовать useEffect в _app.tsx, и это влияло на все страницы. Пример:

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

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

    </>
  );
}; 

И на всех страницах можно было увидеть console.info. Теперь, используя Next.js с каталогом app, в каком файле вы можете использовать глобальный useEffect? Потому что вы не можете использовать useEffect в файлах сервера, например, в layout.tsx.

🤔 А знаете ли вы, что...
React поддерживает локализацию и мультиязычность.


2
52
1

Ответ:

Решено

Как вы можете прочитать в Руководстве по обновлению, pages/_app.js и pages/_document.js были заменены одним корневым макетом app/layout.js.

Таким образом, вы можете поместить свой useEffect в app/layout.js и сделать его клиентским компонентом с "use client" вверху (зная, что это не помешает другим частям приложения быть серверными компонентами):

// app/layout.js

"use client";

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

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

Но скажем, вы не хотите, чтобы ваш корневой макет был клиентским компонентом, вы можете сделать, как показано ниже, например, используя отдельный компонент:

// SomeGlobalComponent.js

"use client";

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

  return <></>;
}

// app/layout.js

import SomeGlobalComponent from "./SomeGlobalComponent";

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