$route 访问路由。useRoute 可组合函数是 vue-router 中同名可组合函数的包装,它提供在 Nuxt 应用中访问当前路由的功能。
主要区别在于,在 Nuxt 中,该可组合函数确保路由仅在导航后页面内容发生变化时才更新。相比之下,vue-router 版本会立即更新路由,这可能导致模板中依赖路由元数据的不同部分出现同步问题,例如。
在以下示例中,我们通过 useFetch 调用 API,其中使用动态页面参数 slug 作为 URL 的一部分。
<script setup lang="ts">
const route = useRoute()
const { data: mountain } = await useFetch(`/api/mountains/${route.params.slug}`)
</script>
<template>
<div>
<h1>{{ mountain.title }}</h1>
<p>{{ mountain.description }}</p>
</div>
</template>
如果你需要访问路由查询参数(例如路径 /test?example=true 中的 example),那么你可以使用 useRoute().query 而不是 useRoute().params。
除了动态参数和查询参数,useRoute() 还提供以下与当前路由相关的计算引用
fullPath:与当前路由关联的编码 URL,包含路径、查询和哈希hash:以 # 开头的 URL 解码后的哈希部分query:访问路由查询参数matched:与当前路由位置匹配的规范化路由数组meta:附加到记录的自定义数据name:路由记录的唯一名称path:URL 的编码路径名部分redirectedFrom:在到达当前路由位置之前尝试访问的路由位置务必使用 Nuxt 的 useRoute() 可组合函数,而不是 vue-router 的,以避免页面导航期间的同步问题。直接从 vue-router 导入 useRoute 会绕过 Nuxt 的实现。
// ❌ do not use `useRoute` from `vue-router`
import { useRoute } from 'vue-router'
// ✅ use Nuxt's `useRoute` composable
import { useRoute } from '#app'
useRoute不建议在中间件中使用 useRoute,因为它可能导致意外行为。中间件中没有“当前路由”的概念。useRoute() 可组合函数只能在 Vue 组件的 setup 函数或 Nuxt 插件中使用。
useRoute() 的任何可组合函数。route.fullPath 的水合问题浏览器在发出请求时不会发送URL 片段(例如 #foo)。因此,使用 route.fullPath 来影响模板可能会触发水合问题,因为这将在客户端包含片段,但在服务器端不包含。