扫描二维码关注或者微信搜一搜:编程智域 前端至全栈交流与成长
一、Nuxt 中的useRouter
方法
useRouter
是 Nuxt 3 提供的一个用于处理路由的重要工具。它让您能够在应用中方便地进行各种路由操作。比如添加路由、导航、路由守卫等。
二、基本功能
addRoute()
:向路由实例添加新的路由。您可以提供parentName
将新路由添加为现有路由的子路由。 示例:
1 2 3
| const router = useRouter(); router.addRoute({ name: 'newRoute', path: '/newPath', component: NewComponent });
|
removeRoute()
:根据名称移除现有路由。 示例:
1 2
| router.removeRoute('newRoute');
|
getRoutes()
:获取所有路由记录的完整列表。 示例:
1 2
| const routes = router.getRoutes();
|
hasRoute()
:检查是否存在具有给定名称的路由。 示例:
1 2
| const hasRoute = router.hasRoute('newRoute');
|
resolve()
:返回路由位置的规范化版本,并包含一个href
属性,其中包含任何现有的基础路径。 示例:
1 2
| const resolvedRoute = router.resolve({ name: 'newRoute' });
|
三、基于 History API 的操作
back()
:如果可能,返回上一页,与router.go(-1)
相同。 示例:
forward()
:如果可能,前进到下一页,与router.go(1)
相同。 示例:
go()
:在历史记录中向前或向后移动,不受router.back()
和router.forward()
中施加的层次结构限制。 示例:
1 2
| router.go(3); // 向前移动 3 步
|
push()
:通过将新条目推入历史堆栈来以编程方式导航到新的 URL。建议使用navigateTo
代替。 示例:
1 2
| router.push({ path: "/newUrl" });
|
replace()
:通过替换当前路由历史堆栈中的当前条目来以编程方式导航到新的 URL。建议使用navigateTo
代替。 示例:
1
| router.replace({ hash: "#bio" });
|
四、导航守卫
定义中间件
匿名(或内联)中间件:
- 直接在页面的
definePageMeta
方法中定义。
1 2 3 4 5 6
| export default { pageMeta: { middleware: ['myMiddleware'] } }
|
命名中间件:
- 放置在
middleware/
目录下,并在页面中通过异步导入自动加载。
1 2 3 4 5
| // 在 `middleware/` 目录下创建文件 export default defineNuxtRouteMiddleware((to, from) => { // 中间件逻辑 })
|
全局中间件:
- 放置在
middleware/
目录下,并以.global
后缀结尾。
1 2 3 4 5
| // 在 `middleware/` 目录下创建文件 export default defineNuxtRouteMiddleware((to, from) => { // 全局中间件逻辑 })
|
使用辅助函数
Nuxt.js 提供了两个全局可用的辅助函数来处理导航:
返回值
中间件返回的值决定了导航的行为:
- 无:不阻止导航,将继续执行下一个中间件函数(如果有的话),或者完成路由导航。
- **
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
是很重要的,否则可能会导致无限重定向循环。 - 使用辅助函数:推荐使用
navigateTo
和abortNavigation
辅助函数来执行重定向或停止导航,以确保与 Nuxt.js 的集成和未来的兼容性。 - 了解变更风险:尽管
navigateTo
和abortNavigation
辅助函数是推荐使用的,但其他在 vue-router 文档中描述的返回值可能也能工作。然而,未来
Nuxt.js 可能会对这些返回值进行更改,因此使用官方推荐的方法是最安全的。
五、Promise 和错误处理
isReady()
:返回一个Promise
,在路由完成初始导航时解析。 示例:
1 2
| const ready = await router.isReady();
|
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>
|
往期文章归档: