<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 开发者工具中查看页面面板,以了解路由名称及其可能接受的参数。

处理静态文件和跨应用链接

默认情况下,<NuxtLink> 对相对路由使用 Vue Router 的客户端导航。当链接指向 /public 目录中的静态文件或同一域名下的另一个应用时,可能会导致意外的 404 错误,因为它们不属于客户端路由。在这种情况下,您可以使用 <NuxtLink>external 属性来绕过 Vue Router 的内部路由机制。

external 属性明确表示链接是外部的。<NuxtLink> 将链接渲染为标准的 HTML <a> 标签。这确保链接行为正确,绕过 Vue Router 的逻辑,直接指向资源。

链接到静态文件

对于 /public 目录中的静态文件(如 PDF 或图片),使用 external 属性确保链接正确解析。

pages/index.vue
<template>
  <NuxtLink to="/example-report.pdf" external>
    下载报告
  </NuxtLink>
</template>

链接到跨应用 URL

当指向同一域名下的不同应用时,使用 external 属性可确保正确行为。

pages/index.vue
<template>
  <NuxtLink to="/another-app" external>
    前往另一个应用
  </NuxtLink>
</template>

使用 external 属性或依靠自动处理可确保正确导航,避免意外的路由问题,并提高与静态资源或跨应用场景的兼容性。

外部路由

在此示例中,我们使用 <NuxtLink> 组件链接到一个网站。

app.vue
<template>
  <NuxtLink to="https://nuxtjs.org">
    Nuxt 官网
  </NuxtLink>
  <!-- <a href="https://nuxtjs.org" rel="noopener noreferrer">...</a> -->
</template>

relnoRel 属性

对于带有 target 属性或绝对链接(例如以 http://https://// 开头的链接),默认会应用 rel 属性值为 noopener noreferrer

  • noopener 解决了旧版浏览器中的安全漏洞
  • noreferrer 通过不发送 Referer 头部信息来提高用户的隐私保护。

这些默认设置对 SEO 没有负面影响,被认为是最佳实践

当您需要覆盖此行为时,可以使用 relnoRel 属性。

app.vue
<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 属性。

app.vue
<template>
  <NuxtLink to="https://github.com/nuxt" no-rel>
    Nuxt GitHub
  </NuxtLink>
  <!-- <a href="https://github.com/nuxt">...</a> -->
</template>
noRelrel 不能同时使用。如果同时设置,rel 将被忽略。

预加载链接

Nuxt 自动包含智能预加载功能。这意味着它会(默认)检测链接是否可见(在视口中或滚动时),并预加载这些页面的 JavaScript,以便在用户点击链接时已准备就绪。Nuxt 仅在浏览器不忙时加载资源,并在您的连接离线或仅为 2G 连接时跳过预加载。

pages/index.vue
<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:当链接被悬停或获得焦点时预加载。此方法监听 pointerenterfocus 事件,在用户表示交互意图时主动预加载资源。

您还可以使用对象来配置 prefetchOn

<template>
  <NuxtLink :prefetch-on="{ interaction: true }">
    此链接将在悬停或获得焦点时预加载
  </NuxtLink>
</template>

您可能不希望同时启用两者!

<template>
  <NuxtLink :prefetch-on="{ visibility: true, interaction: true }">
    此链接将在悬停/获得焦点时或可见时预加载
  </NuxtLink>
</template>

此配置将观察元素进入视口,同时监听 pointerenterfocus 事件。这可能导致不必要的资源使用或重复预加载,因为两种触发器可能在不同条件下预加载同一资源。

启用跨源预加载

要启用跨源预加载,您可以在 nuxt.config 中设置 crossOriginPrefetch 选项。这将使用 Speculation Rules API 启用跨源预加载。

nuxt.config.ts
export default defineNuxtConfig({
  experimental: {
    crossOriginPrefetch: true,
  },
})

全局禁用预加载

您也可以为整个应用全局启用/禁用所有链接的预加载。

nuxt.config.ts
export default defineNuxtConfig({
  experimental: {
    defaults: {
      nuxtLink: {
        prefetch: false,
      },
    },
  },
})

属性

当不使用 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 属性 功能相同
  • hrefto 的别名。如果与 to 一起使用,href 将被忽略
  • noRel:如果设置为 true,将不会为外部链接添加 rel 属性
  • external:强制将链接渲染为 <a> 标签,而不是 Vue Router 的 RouterLink
  • prefetch:启用时,将预加载视口中链接的中间件、布局和数据(当使用 payloadExtraction 时)。由实验性的 crossOriginPrefetch 配置使用
  • prefetchOn:允许自定义控制何时预加载链接。可选值为 interactionvisibility(默认)。您也可以传递一个对象以完全控制,例如:{ interaction: true, visibility: true }。此属性仅在启用 prefetch(默认)且未设置 noPrefetch 时使用
  • noPrefetch:禁用预加载
  • prefetchedClass:应用于已预加载链接的类

Anchor

  • target:应用于链接的 target 属性值
  • rel:应用于链接的 rel 属性值。外部链接默认为 "noopener noreferrer"
默认值可以被覆盖,如果您想更改它们,请参见覆盖默认值

覆盖默认值

在 Nuxt 配置中

您可以在nuxt.config中覆盖一些 <NuxtLink> 的默认值

这些选项未来可能会被移动到其他地方,例如 app.configapp/ 目录。
nuxt.config.ts
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> 的默认值。

components/MyNuxtLink.ts
export default defineNuxtLink({
  componentName: 'MyNuxtLink',
  /* 更多内容见下面的签名 */
})

然后您可以像往常一样使用 <MyNuxtLink /> 组件,带有您的新默认值。

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 中的尾部斜杠的选项。如果未设置或不匹配有效值 appendremove,将被忽略
  • prefetch:是否默认预加载链接
  • prefetchOn:默认应用的预加载策略的细粒度控制
  • prefetchedClass:应用于已预加载链接的默认类
阅读并编辑实时示例中的内容 Docs > Examples > Routing > Pages.