Nuxt.js 路由管理:useRouter 方法与路由中间件应用

avatar
cmdragon 渡劫
image image

扫描二维码关注或者微信搜一搜:编程智域 前端至全栈交流与成长

一、Nuxt 中的useRouter方法

useRouter是 Nuxt 3 提供的一个用于处理路由的重要工具。它让您能够在应用中方便地进行各种路由操作。比如添加路由、导航、路由守卫等。

二、基本功能

  1. addRoute():向路由实例添加新的路由。您可以提供parentName将新路由添加为现有路由的子路由。 示例:
1
2
3
const router = useRouter();
router.addRoute({ name: 'newRoute', path: '/newPath', component: NewComponent });

  1. removeRoute():根据名称移除现有路由。 示例:
1
2
router.removeRoute('newRoute');

  1. getRoutes():获取所有路由记录的完整列表。 示例:
1
2
const routes = router.getRoutes();

  1. hasRoute():检查是否存在具有给定名称的路由。 示例:
1
2
const hasRoute = router.hasRoute('newRoute');

  1. resolve():返回路由位置的规范化版本,并包含一个href属性,其中包含任何现有的基础路径。 示例:
1
2
const resolvedRoute = router.resolve({ name: 'newRoute' });

三、基于 History API 的操作

  1. back():如果可能,返回上一页,与router.go(-1)相同。 示例:
1
2
router.back();

  1. forward():如果可能,前进到下一页,与router.go(1)相同。 示例:
1
2
router.forward();

  1. go():在历史记录中向前或向后移动,不受router.back()router.forward()中施加的层次结构限制。 示例:
1
2
router.go(3);  // 向前移动 3 步

  1. push():通过将新条目推入历史堆栈来以编程方式导航到新的 URL。建议使用navigateTo代替。 示例:
1
2
router.push({ path: "/newUrl" });

  1. replace():通过替换当前路由历史堆栈中的当前条目来以编程方式导航到新的 URL。建议使用navigateTo代替。 示例:
1
router.replace({ hash: "#bio" });

四、导航守卫

定义中间件

  1. 匿名(或内联)中间件

    • 直接在页面的definePageMeta方法中定义。
    1
    2
    3
    4
    5
    6
    export default {
    pageMeta: {
    middleware: ['myMiddleware']
    }
    }

  2. 命名中间件

    • 放置在middleware/目录下,并在页面中通过异步导入自动加载。
    1
    2
    3
    4
    5
    // 在 `middleware/` 目录下创建文件
    export default defineNuxtRouteMiddleware((to, from) => {
    // 中间件逻辑
    })

  3. 全局中间件

    • 放置在middleware/目录下,并以.global后缀结尾。
    1
    2
    3
    4
    5
    // 在 `middleware/` 目录下创建文件
    export default defineNuxtRouteMiddleware((to, from) => {
    // 全局中间件逻辑
    })

使用辅助函数

Nuxt.js 提供了两个全局可用的辅助函数来处理导航:

  • **navigateTo**:用于重定向到给定的路由。

    1
    2
    return navigateTo('/new-route')

  • **abortNavigation**:用于中止当前的导航。

    1
    2
    return abortNavigation()

返回值

中间件返回的值决定了导航的行为:

  • :不阻止导航,将继续执行下一个中间件函数(如果有的话),或者完成路由导航。
  • **navigateTo**:重定向到给定的路径,并在服务器端发生重定向时设置重定向代码为 302 Found 或 301 Moved Permanently。
  • **abortNavigation**:停止当前的导航。
  • abortNavigation(error) :拒绝当前的导航并提供错误信息。

示例

假设我们有一个中间件用于检查用户是否登录,如果未登录则重定向到登录页面:

1
2
3
4
5
6
export default defineNuxtRouteMiddleware((to, from) => {
if (!userIsLoggedIn()) {
return navigateTo('/login')
}
})

注意事项

  • 避免无限循环:在重定向之前检查to.path是很重要的,否则可能会导致无限重定向循环。
  • 使用辅助函数:推荐使用navigateToabortNavigation辅助函数来执行重定向或停止导航,以确保与 Nuxt.js 的集成和未来的兼容性。
  • 了解变更风险:尽管navigateToabortNavigation辅助函数是推荐使用的,但其他在 vue-router 文档中描述的返回值可能也能工作。然而,未来
    Nuxt.js 可能会对这些返回值进行更改,因此使用官方推荐的方法是最安全的。

五、Promise 和错误处理

  1. isReady():返回一个Promise,在路由完成初始导航时解析。 示例:
1
2
const ready = await router.isReady();

  1. onError:添加一个错误处理程序,每次导航期间发生未捕获的错误时都会调用该处理程序。

六、示例应用

以下是一个简单的 Nuxt 3 应用示例,展示了如何使用useRouter的一些常见功能:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// pages/index.vue
<template>
<div>
<h1>Nuxt 3 Router Demo</h1>
<button @click="addNewRoute">Add New Route</button>
<button @click="removeRoute">Remove Route</button>
<button @click="goToNewUrl">Go to New URL</button>
</div>
</template>

<script setup>

const addNewRoute = () => {
router.addRoute({ name: 'newRoute', path: '/newPath', component: () => import('./NewComponent.vue') });
};

const removeRoute = () => {
router.removeRoute('newRoute');
};

const goToNewUrl = () => {
router.push({ path: '/newPath' });
};
</script>

往期文章归档: