<Link>
<Link>
是一个 React 组件,它扩展了 HTML 的 <a>
元素,提供 预加载 (prefetching) 和客户端路由导航功能。它是 Next.js 中在路由之间导航的主要方式。
属性
以下是 Link 组件可用的属性摘要:
属性 | 示例 | 类型 | 必填 |
---|---|---|---|
href | href="/dashboard" | 字符串或对象 | 是 |
replace | replace={false} | 布尔值 | - |
scroll | scroll={false} | 布尔值 | - |
prefetch | prefetch={false} | 布尔值或 null | - |
须知:可以将
<a>
标签的属性(如className
或target="_blank"
)作为属性添加到<Link>
,它们会被传递给底层的<a>
元素。
href
(必填)
要导航到的路径或 URL。
href
也可以接受一个对象,例如:
replace
默认为 false
。 当为 true
时,next/link
将替换当前的历史记录状态,而不是在 浏览器的历史记录栈 中添加一个新的 URL。
scroll
默认为 true
。 <Link>
的默认行为是 滚动到新路由的顶部或保持向后和向前导航的滚动位置。 当为 false
时,next/link
在导航后不会滚动到页面顶部。
须知:
- 如果导航时 页面 (Page) 在视口中不可见,Next.js 会滚动到该页面。
prefetch
当 <Link />
组件进入用户的视口(初始或通过滚动)时,预加载 (prefetching) 会发生。Next.js 会在后台预加载并加载链接的路由(由 href
表示)及其数据,以提高客户端导航的性能。预加载仅在生产环境中启用。
null
(默认):预加载行为取决于路由是静态还是动态。对于静态路由,将预加载完整路由(包括所有数据)。对于动态路由,将预加载到最近的loading.js
边界的分段路由。true
:对于静态和动态路由,都将预加载完整路由。false
:进入视口和悬停时都不会进行预加载。
示例
链接到动态路由
对于动态路由,使用模板字符串创建链接路径会很方便。
例如,您可以生成一个指向动态路由 app/blog/[slug]/page.js
的链接列表:
如果子元素是包裹 <a>
标签的自定义组件
如果 Link
的子元素是包裹 <a>
标签的自定义组件,您必须向 Link
添加 passHref
。如果您使用像 styled-components 这样的库,这是必要的。如果没有这个,<a>
标签将不会有 href
属性,这会损害您网站的可访问性,并可能影响 SEO。如果您使用 ESLint,有一个内置规则 next/link-passhref
来确保正确使用 passHref
。
- 如果您使用 emotion 的 JSX pragma 功能(
@jsx jsx
),即使直接使用<a>
标签,也必须使用passHref
。 - 组件应支持
onClick
属性以正确触发导航。
如果子元素是函数组件
如果 Link
的子元素是函数组件,除了使用 passHref
和 legacyBehavior
外,还必须将组件包裹在 React.forwardRef
中:
使用 URL 对象
Link
也可以接收一个 URL 对象,并会自动格式化它以创建 URL 字符串。以下是操作方法:
上面的示例包含以下链接:
- 预定义路由:
/about?name=test
- 动态路由:
/blog/my-post
您可以使用 Node.js URL 模块文档 中定义的每个属性。
替换 URL 而不是推送
Link
组件的默认行为是将新的 URL 推送到 history
栈中。您可以使用 replace
属性来防止添加新条目,如下例所示:
禁用滚动到页面顶部
Link
的默认行为是滚动到页面顶部。当定义了哈希时,它将滚动到特定的 id,就像普通的 <a>
标签一样。要防止滚动到顶部/哈希,可以向 Link
添加 scroll={false}
:
中间件 (Middleware)
通常使用 中间件 (Middleware) 进行身份验证或其他涉及将用户重写到不同页面的目的。为了使 <Link />
组件能够正确预加载通过中间件重写的链接,您需要告诉 Next.js 要显示的 URL 和要预加载的 URL。这是为了避免不必要的中间件请求以了解正确的预加载路由。
例如,如果您想提供一个具有认证和访客视图的 /dashboard
路由,可以在中间件中添加类似以下内容以将用户重定向到正确的页面:
在这种情况下,您需要在 <Link />
组件中使用以下代码:
版本历史
版本 | 变更内容 |
---|---|
v13.0.0 | 不再需要子 <a> 标签。提供了 codemod 工具来自动更新代码库。 |
v10.0.0 | 指向动态路由的 href 属性会自动解析,不再需要 as 属性。 |
v8.0.0 | 预取 (prefetching) 性能改进。 |
v1.0.0 | 引入 next/link 组件。 |