vue3:九、路由守卫

官网参考:导航守卫 | Vue Router

一、Vue 路由守卫的作用

​1、权限控制

检查用户是否已登录,如果未登录则重定向到登录页面。

根据用户角色限制访问某些路由。

​2、数据预加载

在进入路由前加载必要的数据,确保页面渲染时有完整的数据。

3、​导航拦截

在某些条件下阻止用户离开当前页面(例如表单未保存时)。

​4、日志记录

记录用户访问的路由,用于分析或调试。

​5、动态路由

根据条件动态添加或修改路由。

二、根据路由守卫更改页面的名称

1、引入基本语法

首先输出一下to和from参数

//设置路由守卫
router.beforeEach((to, from, next) => {
  console.log('to', to)
  console.log('from', from)
  next()
})

可查看到一个参数meta.title,其可对标题名称进行修改

2、设置系统总标题

直接设置一个变量即可

//设置系统标题
const SystemTitle = 'SMS后台管理系统';

3、设置路径的标题

在之前设置的项中,设置meta下title的名称

只用设置外层页面的标题,主要的含导航内容的页面暂不修改

4、修改页面标题

修改页面的标题的方法为document.title

//设置系统标题
const SystemTitle = 'SMS后台管理系统';
//设置路由守卫
router.beforeEach((to, from, next) => {
  if(to.meta.title){
    document.title = to.meta.title + '-' + SystemTitle
  }
  next()
})

5、测试效果

三、权限控制

主要针对需要登录的页面,

  • 没有token
    • 在需要登录的页面-跳转登录页面
    • 不需要登录的页面-放行(可以继续执行)
  • 有token
    • 如果在登录页面-跳转到主页面
    • 如果没在登录页面-pinia读取用户信息

1、基本信息设置

首先获取token,查看token是否存在,如果不存在需要跳转到登录页面

①引入token获取

import { getToken } from '@/utils/token';

②获取token

const token = getToken();

③设置无需登录的页面

取name名称,因为404页面的path是一个变化量(

<think>好的,用户想了解Vue3路由守卫的使用方法,我需要根据之前提供的引用内容来组织回答。首先,我需要回顾引用中提到的资料,尤其是引用[2]和引用[3],因为它们都涉及Vue3路由守卫。 根据引用[2],Vue3中的路由守卫分为全局、路由独享和组件内守卫,这和Vue2类似,但可能有一些语法或使用上的差异。引用[3]提到了Vue2中的独享守卫beforeEnter,并指出Vue3中可以和全局后置守卫配合使用。不过用户问的是Vue3,所以需要确保信息是针对Vue3的。 首先,我应该介绍Vue Router的基本概念,然后分点说明不同类型的守卫。全局守卫包括beforeEach、beforeResolve、afterEach,这些在Vue3中应该用法类似,但需要确认是否在Composition API中有变化。路由独享守卫如beforeEnter,应该和Vue2类似,但需要例子展示。组件内守卫包括beforeRouteEnter、beforeRouteUpdate、beforeRouteLeave,这些在Vue3的setup函数中可能需要使用onBeforeRouteUpdate等组合式API函数。 需要注意用户可能对Composition API不太熟悉,所以可能需要提供两种写法:Options API和Composition API的例子。例如,在组件内守卫中,引用[3]提到了Vue2的用法,但Vue3中可能推荐使用setup语法。 然后,我需要确保示例代码正确,比如在Vue3中使用router.beforeEach时,是否有所变化。引用[2]中提到了路由守卫Vue3中的灵活应用,所以可以举例全局守卫检查用户权限,路由独享守卫处理特定路由的验证,组件内守卫处理离开前的确认。 另外,引用[2]提到合理使用守卫提升安全性和用户体验,所以在每个例子中需要说明应用场景,比如登录验证、权限检查、数据保存提示等。 最后,生成相关问题时要围绕路由守卫的进阶使用、与Vue2的区别、常见问题等。确保问题有针对性,帮助用户深入理解。 总结步骤: 1. 介绍Vue3路由守卫的类型。 2. 分别详细说明每种守卫的设置方法,提供示例代码。 3. 对比Vue2和Vue3的差异(如Composition API的使用)。 4. 强调实际应用场景和最佳实践。 5. 生成相关问题。</think>在 Vue3 中设置和使用路由守卫主要通过 Vue Router 实现,路由守卫分为**全局守卫**、**路由独享守卫**和**组件内守卫**三类。以下是具体方法及示例: --- ### 一、全局守卫 通过 `router` 实例直接定义,作用于所有路由。 1. **全局前置守卫 `beforeEach`** 在路由跳转前触发,常用于权限验证: ```javascript const router = createRouter({ /* 路由配置 */ }); router.beforeEach((to, from, next) => { if (to.meta.requiresAuth && !isAuthenticated) { next(&#39;/login&#39;); // 跳转到登录页 } else { next(); // 放行 } }); ``` 2. **全局解析守卫 `beforeResolve`** 在导航被确认前触发,适合处理异步数据加载: ```javascript router.beforeResolve(async (to) => { await fetchData(to.params.id); // 预加载数据 }); ``` 3. **全局后置守卫 `afterEach`** 在导航完成后触发,常用于日志记录或页面分析: ```javascript router.afterEach((to, from) => { logPageView(to.fullPath); // 记录页面访问 }); ``` --- ### 二、路由独享守卫 在单个路由配置中定义,仅作用于当前路由。 - **`beforeEnter` 守卫** 例如限制只有特定权限才能访问: ```javascript const routes = [ { path: &#39;/admin&#39;, component: AdminPage, beforeEnter: (to, from, next) => { if (user.role !== &#39;admin&#39;) { next(&#39;/403&#39;); // 跳转到无权限页 } else { next(); } } } ]; ``` --- ### 三、组件内守卫Vue 组件中定义,作用于当前组件路由。 1. **`beforeRouteEnter`** 在组件渲染前调用,此时无法访问 `this`: ```javascript export default { beforeRouteEnter(to, from, next) { next(vm => { vm.fetchData(); // 通过 vm 访问组件实例 }); } }; ``` 2. **`beforeRouteUpdate`** 在当前路由改变但组件复用时触发(如路径参数变化): ```javascript export default { async beforeRouteUpdate(to, from) { this.data = await fetchData(to.params.id); // 更新数据 } }; ``` 3. **`beforeRouteLeave`** 在离开当前路由前触发,常用于阻止未保存的数据丢失: ```javascript export default { beforeRouteLeave(to, from, next) { if (this.hasUnsavedChanges) { const confirm = window.confirm(&#39;确认离开?未保存的数据将丢失&#39;); if (confirm) next(); else next(false); // 取消导航 } else { next(); } } }; ``` --- ### 四、组合式 API 写法 Vue3 的 `setup` 函数中需使用 `onBeforeRouteUpdate` 和 `onBeforeRouteLeave`: ```javascript import { onBeforeRouteLeave, onBeforeRouteUpdate } from &#39;vue-router&#39;; export default { setup() { onBeforeRouteUpdate(async (to, from) => { // 处理路由参数变化 }); onBeforeRouteLeave((to, from, next) => { // 离开前的逻辑 }); } }; ``` --- ### 应用场景示例 1. **登录验证**:通过全局前置守卫拦截未登录用户[^2]。 2. **动态权限**:路由独享守卫验证用户角色[^3]。 3. **数据预加载**:全局解析守卫提前获取数据[^2]。 4. **离开确认**:组件内守卫防止误操作丢失数据[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

25号底片~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值