<NuxtLink>
Nuxt 提供 <NuxtLink> 组件来处理应用程序中的任何链接。
<NuxtLink> 是 Vue Router 的 <RouterLink> 组件和 HTML 的 <a> 标签的替代品。它智能地判断链接是 内部 还是 外部,并根据可用的优化(预取、默认属性等)进行相应渲染。
内部路由
在此示例中,我们使用 <NuxtLink> 组件链接到应用程序的另一个页面。
<template>
<NuxtLink to="/about">关于页面</NuxtLink>
</template>
向动态路由传递参数
在此示例中,我们传递 id 参数以链接到路由 ~/pages/posts/[id].vue。
<template>
<NuxtLink :to="{ name: 'posts-id', params: { id: 123 } }">
帖子 123
</NuxtLink>
</template>
查看 Nuxt DevTools 中的 Pages 面板以查看路由名称及其可能接受的参数。
当您将对象传递给 to 属性时,<NuxtLink> 将继承 Vue Router 对查询参数的处理。键和值将自动编码,因此您无需手动调用 encodeURI 或 encodeURIComponent。
处理静态文件和跨应用链接
默认情况下,<NuxtLink> 使用 Vue Router 的客户端导航来处理相对路由。当链接到 /public 目录中的静态文件或托管在同一域上的另一个应用程序时,可能会导致意外的 404 错误,因为它们不属于客户端路由的一部分。在这种情况下,您可以使用 <NuxtLink> 的 external 属性来绕过 Vue Router 的内部路由机制。
external 属性明确表示链接是外部的。<NuxtLink> 将链接渲染为标准 HTML <a> 标签。这确保了链接的正确行为,绕过 Vue Router 的逻辑并直接指向资源。
链接到静态文件
对于 /public 目录中的静态文件,例如 PDF 或图像,使用 external 属性以确保链接正确解析。
<template>
<NuxtLink to="/example-report.pdf" external>
下载报告
</NuxtLink>
</template>
链接到跨应用 URL
当指向同一域上的不同应用程序时,使用 external 属性可确保正确的行为。
<template>
<NuxtLink to="/another-app" external>
前往另一个应用
</NuxtLink>
</template>
使用 external 属性或依赖自动处理可确保正确的导航,避免意外的路由问题,并提高与静态资源或跨应用场景的兼容性。
外部路由
在此示例中,我们使用 <NuxtLink> 组件链接到一个网站。
<template>
<NuxtLink to="https://nuxtjs.org">
Nuxt 网站
</NuxtLink>
<!-- <a href="https://nuxtjs.org" rel="noopener noreferrer">...</a> -->
</template>
rel 和 noRel 属性
默认情况下,带有 target 属性的链接或绝对链接(例如,以 http://、https:// 或 // 开头的链接)会应用 noopener noreferrer 的 rel 属性。
noopener解决了旧浏览器中的一个安全漏洞。noreferrer通过不向链接站点发送Referer头来提高用户的隐私。
这些默认设置对 SEO 没有负面影响,并被认为是最佳实践。
当您需要覆盖此行为时,可以使用 rel 或 noRel 属性。
<template>
<NuxtLink to="https://twitter.com/nuxt_js">
Nuxt Twitter
</NuxtLink>
<!-- <a href="https://twitter.com/nuxt_js" rel="noopener noreferrer">...</a> -->
<NuxtLink to="https://discord.nuxtjs.org" rel="noopener">
Nuxt Discord
</NuxtLink>
<!-- <a href="https://discord.nuxtjs.org" rel="noopener">...</a> -->
<NuxtLink to="/about" target="_blank">关于页面</NuxtLink>
<!-- <a href="/about" target="_blank" rel="noopener noreferrer">...</a> -->
</template>
可以使用 noRel 属性防止默认的 rel 属性被添加到绝对链接。
<template>
<NuxtLink to="https://github.com/nuxt" no-rel>
Nuxt GitHub
</NuxtLink>
<!-- <a href="https://github.com/nuxt">...</a> -->
</template>
noRel 和 rel 不能同时使用。rel 将被忽略。
预取链接
Nuxt 自动包含智能预取。这意味着它检测链接何时可见(默认情况下),无论是在视口中还是在滚动时,并预取这些页面的 JavaScript,以便在用户点击链接时准备就绪。Nuxt 仅在浏览器不忙时加载资源,并在您的连接离线或仅有 2g 连接时跳过预取。
<NuxtLink to="/about" no-prefetch>关于页面未预取</NuxtLink>
<NuxtLink to="/about" :prefetch="false">关于页面未预取</NuxtLink>
自定义预取触发器
在 v3.13.0 之后,我们现在支持 <NuxtLink> 的自定义预取触发器。您可以使用 prefetchOn 属性来控制何时预取链接。
<template>
<NuxtLink prefetch-on="visibility">
这将在可见时预取(默认)
</NuxtLink>
<NuxtLink prefetch-on="interaction">
这将在悬停或获得焦点时预取
</NuxtLink>
</template>
visibility: 当链接在视口中可见时预取。使用 Intersection Observer API 监视元素与视口的交集。当元素滚动到视图中时触发预取。interaction: 当链接被悬停或聚焦时预取。这种方法监听pointerenter和focus事件,当用户表示要进行交互时主动预取资源。
您还可以使用对象来配置 prefetchOn:
<template>
<NuxtLink :prefetch-on="{ interaction: true }">
这将在悬停或获得焦点时预取
</NuxtLink>
</template>
您可能不希望同时启用这两者!
<template>
<NuxtLink :prefetch-on="{ visibility: true, interaction: true }">
这将在悬停/聚焦时预取 - 或在可见时预取
</NuxtLink>
</template>
此配置将观察元素何时进入视口,并监听 pointerenter 和 focus 事件。这可能导致不必要的资源使用或冗余预取,因为两种触发器可以在不同条件下预取相同资源。
启用跨域预取
要启用跨域预取,您可以在 nuxt.config 中设置 crossOriginPrefetch 选项。这将使用 Speculation Rules API 启用跨域预取。
export default defineNuxtConfig({
experimental: {
crossOriginPrefetch: true,
},
})
全局禁用预取
也可以为您的应用程序全局启用/禁用所有链接的预取。
export default defineNuxtConfig({
experimental: {
defaults: {
nuxtLink: {
prefetch: false,
},
},
},
})
属性
RouterLink
当不使用 external 时,<NuxtLink> 支持所有 Vue Router 的 RouterLink 属性
to: 任何 URL 或来自 Vue Router 的 路由位置对象custom: 是否应将<NuxtLink>的内容包装在<a>元素中。它允许完全控制链接的渲染方式以及点击时的导航方式。与 Vue Router 的custom属性 相同exactActiveClass: 应用于精确活动链接的类。与 Vue Router 的exactActiveClass属性 在内部链接上相同。默认为 Vue Router 的默认值("router-link-exact-active")activeClass: 应用于活动链接的类。与 Vue Router 的activeClass属性 在内部链接上相同。默认为 Vue Router 的默认值("router-link-active")replace: 与 Vue Router 的replace属性 在内部链接上相同ariaCurrentValue: 应用于精确活动链接的aria-current属性值。与 Vue Router 的ariaCurrentValue属性 在内部链接上相同
NuxtLink
href:to的别名。如果与to一起使用,href将被忽略noRel: 如果设置为true,则不会将rel属性添加到外部链接external: 强制将链接渲染为<a>标签而不是 Vue Router 的RouterLink。prefetch: 启用时将在视口中预取链接的中间件、布局和有效负载(使用 payloadExtraction 时)。由实验性 crossOriginPrefetch 配置使用。prefetchOn: 允许自定义控制何时预取链接。可能的选项是interaction和visibility(默认)。您还可以传递一个对象以获得完全控制,例如:{ interaction: true, visibility: true }。此属性仅在prefetch启用(默认)且未设置noPrefetch时使用。noPrefetch: 禁用预取。prefetchedClass: 应用于已预取链接的类。
Anchor
target: 应用于链接的target属性值rel: 应用于链接的rel属性值。默认为外部链接的"noopener noreferrer"。
默认值可以被覆盖,请参阅覆盖默认值以了解如何更改它们。
覆盖默认值
在 Nuxt 配置中
您可以在 nuxt.config 中覆盖一些 <NuxtLink> 的默认值
这些选项可能会在未来移到其他地方,例如 app.config 或 app/ 目录中。
export default defineNuxtConfig({
experimental: {
defaults: {
nuxtLink: {
// 默认值
componentName: 'NuxtLink',
externalRelAttribute: 'noopener noreferrer',
activeClass: 'router-link-active',
exactActiveClass: 'router-link-exact-active',
prefetchedClass: undefined, // 可以是任何有效的字符串类名
trailingSlash: undefined // 可以是 'append' 或 'remove'
prefetch: true,
prefetchOn: { visibility: true }
}
}
}
})
自定义链接组件
您可以通过使用 defineNuxtLink 创建自己的链接组件来覆盖 <NuxtLink> 的默认值。
export default defineNuxtLink({
componentName: 'MyNuxtLink',
/* 参见下面的签名 */
})
然后,您可以像往常一样使用 <MyNuxtLink /> 组件,并使用您的新默认值。
defineNuxtLink 签名
interface NuxtLinkOptions {
componentName?: string;
externalRelAttribute?: string;
activeClass?: string;
exactActiveClass?: string;
trailingSlash?: 'append' | 'remove'
prefetch?: boolean
prefetchedClass?: string
prefetchOn?: Partial<{
visibility: boolean
interaction: boolean
}>
}
function defineNuxtLink(options: NuxtLinkOptions): Component {}
componentName: 组件的名称。默认是NuxtLink。externalRelAttribute: 应用于外部链接的默认rel属性值。默认为"noopener noreferrer"。设置为""以禁用activeClass: 应用于活动链接的默认类。与 Vue Router 的linkActiveClass选项 相同。默认为 Vue Router 的默认值("router-link-active")exactActiveClass: 应用于精确活动链接的默认类。与 Vue Router 的linkExactActiveClass选项 相同。默认为 Vue Router 的默认值("router-link-exact-active")trailingSlash: 一个选项,用于在href中添加或删除尾部斜杠。如果未设置或不匹配有效值append或remove,则将被忽略。prefetch: 是否默认预取链接。prefetchOn: 默认应用哪些预取策略的详细控制。prefetchedClass: 应用于已预取链接的默认类。