<NuxtLink>
<NuxtLink> 是 Vue Router 的 <RouterLink> 组件和 HTML 的 <a> 标签的直接替代品。它能智能判断链接是内部还是外部链接,并结合可用的优化(预加载、默认属性等)对其进行相应的渲染。内部路由
在此示例中,我们使用 <NuxtLink> 组件链接到应用程序的另一个页面。
<template>
<NuxtLink to="/about">About page</NuxtLink>
</template>
<!-- (Vue Router & Smart Prefetching) -->
<a href="/about">About page</a>
向动态路由传递参数
在此示例中,我们传递 id 参数以链接到路由 ~/pages/posts/[id].vue。
<template>
<NuxtLink :to="{ name: 'posts-id', params: { id: 123 } }">
Post 123
</NuxtLink>
</template>
<a href="/posts/123">Post 123</a>
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
>
Download Report
</NuxtLink>
</template>
链接到跨应用 URL
当指向同一域上的不同应用程序时,使用 external 属性可确保正确的行为。
<template>
<NuxtLink
to="/another-app"
external
>
Go to Another App
</NuxtLink>
</template>
使用 external 属性或依赖自动处理可确保正常的导航,避免意外的路由问题,并提高与静态资源或跨应用场景的兼容性。
外部路由
在此示例中,我们使用 <NuxtLink> 组件链接到一个网站。
<template>
<NuxtLink to="https://nuxtjs.org.cn">
Nuxt website
</NuxtLink>
<!-- <a href="https://nuxtjs.org.cn" 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"
>About page</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 连接,则会跳过预加载。
使用 custom 属性时,<NuxtLink> 不会自动附加预加载处理程序。您可以自己从自定义插槽中调用 prefetch。
<NuxtLink to="/about" no-prefetch>
About page not pre-fetched
</NuxtLink>
<NuxtLink to="/about" :prefetch="false">
About page not pre-fetched
</NuxtLink>
自定义预加载触发器
从 v3.13.0 开始,我们为 <NuxtLink> 支持了自定义预加载触发器。您可以使用 prefetchOn 属性来控制何时预加载链接。
<template>
<NuxtLink prefetch-on="visibility">
This will prefetch when it becomes visible (default)
</NuxtLink>
<NuxtLink prefetch-on="interaction">
This will prefetch when hovered or when it gains focus
</NuxtLink>
</template>
visibility:当链接在视口中可见时进行预加载。使用 Intersection Observer API 监控元素与视口的交叉情况。当元素滚动到可视区域时触发预加载。interaction:当链接被悬停或聚焦时进行预加载。此方法监听pointerenter和focus事件,在用户表现出交互意图时主动预加载资源。
您还可以使用对象来配置 prefetchOn
<template>
<NuxtLink :prefetch-on="{ interaction: true }">
This will prefetch when hovered or when it gains focus
</NuxtLink>
</template>
您通常不会希望同时启用这两者!
<template>
<NuxtLink :prefetch-on="{ visibility: true, interaction: true }">
This will prefetch when hovered/focus - or when it becomes visible
</NuxtLink>
</template>
此配置将观察元素何时进入视口,同时监听 pointerenter 和 focus 事件。这可能会导致不必要的资源使用或冗余预加载,因为两个触发器可能会在不同条件下预加载相同的资源。
当使用 custom 时,预加载由您的插槽实现来控制 v4.5
<template>
<NuxtLink
v-slot="{ href, navigate, prefetch, shouldPrefetch }"
to="/about"
custom
>
<a
:href="href"
@click="navigate"
@pointerenter="shouldPrefetch('interaction') && prefetch()"
@focus="shouldPrefetch('interaction') && prefetch()"
>
About page
</a>
</NuxtLink>
</template>
启用跨域预加载
要启用跨域预加载,您可以在 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:应用于已预加载链接的类名。
custom 属性时,prefetch、prefetchOn 和 prefetchedClass 不会自动附加处理程序或类名。请使用自定义插槽的 prefetch、prefetched 和 shouldPrefetch 值来实现此行为。锚点
target:应用于链接的target属性值rel:应用于链接的rel属性值。对于外部链接,默认为"noopener noreferrer"。
覆盖默认值
在 Nuxt 配置中
您可以在 nuxt.config 中覆盖某些 <NuxtLink> 默认值
app.config 或 app/ 目录中。export default defineNuxtConfig({
experimental: {
defaults: {
nuxtLink: {
// default values
componentName: 'NuxtLink',
externalRelAttribute: 'noopener noreferrer',
activeClass: 'router-link-active',
exactActiveClass: 'router-link-exact-active',
prefetchedClass: undefined, // can be any valid string class name
trailingSlash: undefined, // can be 'append' or 'remove'
prefetch: true,
prefetchOn: { visibility: true },
},
},
},
})
自定义链接组件
您可以通过使用 defineNuxtLink 创建自己的链接组件来覆盖 <NuxtLink> 的默认值。
export default defineNuxtLink({
componentName: 'MyNuxtLink',
/* see signature below for more */
})
该组件会根据其文件名自动导入,因此您可以像往常一样使用带有新默认值的 <MyNuxtLink />。componentName 仅设置组件的内部名称(如在 Vue DevTools 中所示);它不会改变组件在模板中的使用方式。
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:组件的内部名称,如 Vue DevTools 中所示。它不会改变模板中使用的名称(该名称来自组件的文件名)。默认为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:应用于已预加载链接的默认类名。