自定义 App
Next.js 使用 App 组件来初始化页面。你可以覆盖它并控制页面初始化以实现:
- 在页面切换之间创建共享布局
- 向页面注入额外的数据
- 添加全局 CSS
用法
要覆盖默认的 App,创建 文件 pages/_app,如下所示:
- TypeScript
- JavaScript
pages/_app.tsx
import type { AppProps } from 'next/app'
export default function MyApp({ Component, pageProps }: AppProps) {
return <Component {...pageProps} />
}
pages/_app.jsx
export default function MyApp({ Component, pageProps }) {
return <Component {...pageProps} />
}
Component prop 是当前活动的 page,因此每当你在路由之间导航时,Component 将改变为新的 page。因此,你发送给 Component 的任何 props 都将被 page 接收。
pageProps 是一个对象,包含通过我们的数据获取方法为你的页面预加载的初始 props,否则它是一个空对象。
提示:
- 如果你的应用正在运行并且你添加了自定义
App,你需要重启开发服务器。仅当pages/_app.js之前不存在时才需要。App不支持 Next.js 的数据获取方法,如getStaticProps或getServerSideProps。
在 App 中使用 getInitialProps
在 App 中使用 getInitialProps 将为没有 getStaticProps 的页面禁用自动静态优化。
我们不推荐使用这种模式。 相反,考虑逐步采用 App 路由,它可以让你更轻松地为页面和布局获取数据。
- TypeScript
- JavaScript
pages/_app.tsx
import App, { AppContext, AppInitialProps, AppProps } from 'next/app'
type AppOwnProps = { example: string }
export default function MyApp({
Component,
pageProps,
example,
}: AppProps & AppOwnProps) {
return (
<>
<p>数据:{example}</p>
<Component {...pageProps} />
</>
)
}
MyApp.getInitialProps = async (
context: AppContext
): Promise<AppOwnProps & AppInitialProps> => {
const ctx = await App.getInitialProps(context)
return { ...ctx, example: 'data' }
}
pages/_app.jsx
import App from 'next/app'
export default function MyApp({ Component, pageProps, example }) {
return (
<>
<p>数据:{example}</p>
<Component {...pageProps} />
</>
)
}
MyApp.getInitialProps = async (context) => {
const ctx = await App.getInitialProps(context)
return { ...ctx, example: 'data' }
}