Nuxt 的一个核心功能是文件系统路由。 app/pages/ 目录中的每个 Vue 文件都会创建一个相应的 URL(或路由),用于显示该文件的内容。通过为每个页面使用动态导入,Nuxt 利用代码分割来为请求的路由提供最少量的 JavaScript。
Nuxt 路由基于Vue Router并根据 app/pages/ 目录中创建的每个组件的文件名生成路由。
此文件系统路由使用命名约定来创建动态和嵌套路由。
-| pages/
---| about.vue
---| index.vue
---| posts/
-----| [id].vue
{
"routes": [
{
"path": "/about",
"component": "pages/about.vue"
},
{
"path": "/",
"component": "pages/index.vue"
},
{
"path": "/posts/:id",
"component": "pages/posts/[id].vue"
}
]
}
<NuxtLink> 组件用于在页面之间进行链接。它渲染一个带有 href 属性设置为页面路由的 <a> 标签。一旦应用程序被激活,页面过渡将在 JavaScript 中通过更新浏览器 URL 来执行。这可以防止页面完全刷新并允许动画过渡。
当 <NuxtLink> 在客户端进入视口时,Nuxt 将自动预取链接页面的组件和有效负载(生成的页面),从而实现更快的导航。
<template>
<header>
<nav>
<ul>
<li><NuxtLink to="/about">About</NuxtLink></li>
<li><NuxtLink to="/posts/1">Post 1</NuxtLink></li>
<li><NuxtLink to="/posts/2">Post 2</NuxtLink></li>
</ul>
</nav>
</header>
</template>
useRoute() 可组合项可以在 Vue 组件的 <script setup> 块或 setup() 方法中使用,以访问当前路由详细信息。
<script setup lang="ts">
const route = useRoute()
// When accessing /posts/1, route.params.id will be 1
console.log(route.params.id)
</script>
Nuxt 提供了一个可自定义的路由中间件框架,您可以在整个应用程序中使用它,非常适合提取您希望在导航到特定路由之前运行的代码。
路由中间件有三种类型:
app/middleware/ 目录中,并在页面中使用时通过异步导入自动加载。(注意:路由中间件名称被规范化为 kebab-case,因此 someMiddleware 变为 some-middleware。)app/middleware/ 目录中(带有 .global 后缀),并将在每次路由更改时自动运行。auth 中间件保护 /dashboard 页面的示例
export default defineNuxtRouteMiddleware((to, from) => {
// isAuthenticated() is an example method verifying if a user is authenticated
if (isAuthenticated() === false) {
return navigateTo('/login')
}
})
<script setup lang="ts">
definePageMeta({
middleware: 'auth',
})
</script>
<template>
<h1>Welcome to your dashboard</h1>
</template>
Nuxt 通过在您希望验证的每个页面中使用 definePageMeta() 中的 validate 属性提供路由验证。
validate 属性接受 route 作为参数。您可以返回一个布尔值来确定这是否是使用此页面渲染的有效路由。如果您返回 false,这将导致 404 错误。您还可以直接返回一个带有 statusCode/statusMessage 的对象来自定义返回的错误。
如果您有更复杂的用例,则可以使用匿名路由中间件。
<script setup lang="ts">
definePageMeta({
validate (route) {
// Check if the id is made up of digits
return typeof route.params.id === 'string' && /^\d+$/.test(route.params.id)
},
})
</script>