Capítulo 342 de 456
No Pages Router, cada arquivo em pages/ exportando um componente React é automaticamente uma rota; layouts compartilhados são construídos via composição de componentes (single shared layout via _app ou per-page layouts via getLayout).
.js/.jsx/.ts/.tsx dentro de pages/, mapeado por nome de arquivo.pages/index.js → /; pages/blog/index.js → /blog.pages/blog/first-post.js → /blog/first-post; refletem a estrutura de pastas.Layout reutilizado entre páginas (navbar/footer comuns).<Component /> com <Layout> dentro de pages/_app.js; preserva estado do layout entre navegações.Page.getLayout retorna o componente de layout específico daquela página, permitindo layouts aninhados diferentes por rota.NextPageWithLayout: tipo TypeScript que estende NextPage com getLayout?: (page: ReactElement) => ReactNode.import Layout from '../components/layout'
import NestedLayout from '../components/nested-layout'
export default function Page() {
return (
/** Your content */
)
}
Page.getLayout = function getLayout(page) {
return (
<Layout>
<NestedLayout>{page}</NestedLayout>
</Layout>
)
}
export default function MyApp({ Component, pageProps }) {
// Use the layout defined at the page level, if available
const getLayout = Component.getLayout ?? ((page) => page)
return getLayout(<Component {...pageProps} />)
}
import type { ReactElement, ReactNode } from 'react'
import type { NextPage } from 'next'
import type { AppProps } from 'next/app'
export type NextPageWithLayout<P = {}, IP = P> = NextPage<P, IP> & {
getLayout?: (page: ReactElement) => ReactNode
}
type AppPropsWithLayout = AppProps & {
Component: NextPageWithLayout
}
export default function MyApp({ Component, pageProps }: AppPropsWithLayout) {
const getLayout = Component.getLayout ?? ((page) => page)
return getLayout(<Component {...pageProps} />)
}
getLayout em _app.tsx.getStaticProps/getServerSideProps dentro do componente Layout: não é uma Page, então essas funções não têm efeito ali; buscar dados client-side (useEffect, SWR) dentro do layout._app) e per-page (getLayout, para layouts distintos/aninhados).getLayout preserva estado de UI (inputs, scroll) entre navegações porque mantém a árvore de componentes React estável (reconciliation).Layout component só pode ser client-side.pages/_app.js): ponto central onde o padrão de layout global é aplicado.