跳到内容

page.js

page 文件允许您定义路线**独有**的用户界面。您可以通过从文件中默认导出组件来创建页面

app/blog/[slug]/page.tsx
export default function Page({
  params,
  searchParams,
}: {
  params: Promise<{ slug: string }>
  searchParams: Promise<{ [key: string]: string | string[] | undefined }>
}) {
  return <h1>My Page</h1>
}

须知

  • page 可以使用 .js.jsx.tsx 文件扩展名。
  • page 始终是路由子树的**叶子**。
  • 需要 page 文件才能使路由段**公开访问**。
  • 页面默认是 服务器组件,但可以设置为 客户端组件

参考

属性

params (可选)

一个解析为对象的 Promise,其中包含从根段到该页面的动态路由参数

app/shop/[slug]/page.tsx
export default async function Page({
  params,
}: {
  params: Promise<{ slug: string }>
}) {
  const { slug } = await params
}
路由示例URLparams
app/shop/[slug]/page.js/shop/1Promise<{ slug: '1' }>
app/shop/[category]/[item]/page.js/shop/1/2Promise<{ category: '1', item: '2' }>
app/shop/[...slug]/page.js/shop/1/2Promise<{ slug: ['1', '2'] }>
  • 由于 params 属性是一个 Promise,您必须使用 async/await 或 React 的 use 函数来访问这些值。
    • 在 14 版及更早版本中,params 是一个同步属性。为了帮助实现向后兼容性,您仍然可以在 Next.js 15 中同步访问它,但此行为将来会被弃用。

searchParams (可选)

一个解析为包含当前 URL 搜索参数 的对象的 Promise。例如:

app/shop/page.tsx
export default async function Page({
  searchParams,
}: {
  searchParams: Promise<{ [key: string]: string | string[] | undefined }>
}) {
  const filters = (await searchParams).filters
}

客户端组件**页面**也可以使用 React 的 use 钩子来访问 searchParams

app/shop/page.tsx
'use client'
import { use } from 'react'
 
export default function Page({
  searchParams,
}: {
  searchParams: Promise<{ [key: string]: string | string[] | undefined }>
}) {
  const filters = use(searchParams).filters
}
示例 URLsearchParams
/shop?a=1Promise<{ a: '1' }>
/shop?a=1&b=2Promise<{ a: '1', b: '2' }>
/shop?a=1&a=2Promise<{ a: ['1', '2'] }>
  • 由于 searchParams 属性是一个 Promise。您必须使用 async/await 或 React 的 use 函数来访问这些值。
    • 在 14 及更早版本中,searchParams 是一个同步属性。为了向后兼容,您仍然可以在 Next.js 15 中同步访问它,但此行为将来会被弃用。
  • searchParams 是一个**动态 API**,其值无法提前得知。使用它将使页面在请求时选择**动态渲染**。
  • searchParams 是一个普通的 JavaScript 对象,而不是 URLSearchParams 实例。

页面属性助手

您可以使用 PageProps 对页面进行类型化,以从路由字面量中获取强类型的 paramssearchParamsPageProps 是一个全局可用的助手。

app/blog/[slug]/page.tsx
export default async function Page(props: PageProps<'/blog/[slug]'>) {
  const { slug } = await props.params
  const query = await props.searchParams
  return <h1>Blog Post: {slug}</h1>
}

须知

  • 使用字面量路由(例如 '/blog/[slug]')可以为 params 启用自动补全和严格键。
  • 静态路由将 params 解析为 {}
  • 类型在 next devnext build 或使用 next typegen 期间生成。
  • 生成类型后,PageProps 助手是全局可用的。它不需要导入。

示例

根据 params 显示内容

使用 动态路由段,您可以根据 params 属性为页面显示或获取特定内容。

app/blog/[slug]/page.tsx
export default async function Page({
  params,
}: {
  params: Promise<{ slug: string }>
}) {
  const { slug } = await params
  return <h1>Blog Post: {slug}</h1>
}

使用 searchParams 处理过滤

您可以使用 searchParams 属性根据 URL 的查询字符串处理过滤、分页或排序。

app/shop/page.tsx
export default async function Page({
  searchParams,
}: {
  searchParams: Promise<{ [key: string]: string | string[] | undefined }>
}) {
  const { page = '1', sort = 'asc', query = '' } = await searchParams
 
  return (
    <div>
      <h1>Product Listing</h1>
      <p>Search query: {query}</p>
      <p>Current page: {page}</p>
      <p>Sort order: {sort}</p>
    </div>
  )
}

在客户端组件中读取 searchParamsparams

要在客户端组件(不能是 async)中使用 searchParamsparams,您可以使用 React 的 use 函数来读取 Promise

app/page.tsx
'use client'
 
import { use } from 'react'
 
export default function Page({
  params,
  searchParams,
}: {
  params: Promise<{ slug: string }>
  searchParams: Promise<{ [key: string]: string | string[] | undefined }>
}) {
  const { slug } = use(params)
  const { query } = use(searchParams)
}

版本历史

版本更改
v15.0.0-RCparamssearchParams 现在是 Promise。提供了代码修改工具
v13.0.0引入 page