Vue3中导航守卫的使用教程

 更新时间:2023年08月23日 09:37:37   作者:一花一world  
在Vue3中,导航守卫(Navigation Guards)用于在路由切换前后执行一些操作,例如验证用户权限、取消路由导航等,本文主要为大家介绍了vue3中导航守卫的使用方法,需要的可以参考下

在Vue 3中,导航守卫(Navigation Guards)用于在路由切换前后执行一些操作,例如验证用户权限、取消路由导航等。Vue 3中的导航守卫与Vue 2中的导航守卫略有不同。下面是Vue 3中导航守卫的使用方式:

全局前置守卫(Global Before Guards)

beforeEach:在路由切换前执行,可以用来进行权限验证或其他全局操作。

使用方法:

import { createRouter, createWebHistory } from 'vue-router';
const router = createRouter({
  history: createWebHistory(),
  routes: [...]
});
router.beforeEach((to, from, next) => {
  // 执行一些操作,例如权限验证
  // 如果要继续路由导航,调用next();如果要取消导航,调用next(false)
  next();
});
export default router;

全局后置守卫(Global After Guards)

afterEach:在路由切换后执行,可以用来进行一些全局操作,例如页面统计。

使用方法:

import { createRouter, createWebHistory } from 'vue-router';
const router = createRouter({
  history: createWebHistory(),
  routes: [...]
});
router.afterEach((to, from) => {
  // 执行一些操作,例如页面统计
});
export default router;

路由独享守卫(Per-Route Guards)

beforeEnter:在单个路由配置中定义,只对该路由生效。

使用方法:

import { createRouter, createWebHistory } from 'vue-router';
const router = createRouter({
  history: createWebHistory(),
  routes: [
    {
      path: '/example',
      component: ExampleComponent,
      beforeEnter: (to, from, next) => {
        // 在进入该路由前执行一些操作
        next();
      }
    },
    // 其他路由配置...
  ]
});
export default router;

组件内的守卫(In-Component Guards)

  • beforeRouteEnter:在进入路由前执行,可以访问组件实例。
  • beforeRouteUpdate:在当前路由复用组件时执行,例如从 /user/1 切换到 /user/2。
  • beforeRouteLeave:在离开当前路由前执行。

使用方法:

import { ref } from 'vue';
export default {
  beforeRouteEnter(to, from, next) {
    // 在进入路由前执行一些操作
    next();
  },
  beforeRouteUpdate(to, from, next) {
    // 在当前路由复用组件时执行一些操作
    next();
  },
  beforeRouteLeave(to, from, next) {
    // 在离开当前路由前执行一些操作
    next();
  },
  // 组件其他配置...
};

这些导航守卫可以在Vue 3中的路由配置中使用,用于控制路由的导航行为和执行一些额外的操作

实现登录

1.创建一个用于存储登录状态的全局变量,例如 isLoggedIn,并设置初始值为 false。

2.在全局前置守卫中检查登录状态,如果用户未登录且访问的是需要登录才能访问的页面,则取消导航并重定向到登录页面。

import { createRouter, createWebHistory } from 'vue-router';
const router = createRouter({
  history: createWebHistory(),
  routes: [...]
});
router.beforeEach((to, from, next) => {
  // 检查登录状态
  if (to.meta.requiresAuth && !isLoggedIn.value) {
    next('/login'); // 重定向到登录页面
  } else {
    next(); // 继续路由导航
  }
});
export default router;

3.在登录页面的组件内,使用 beforeRouteEnter 守卫来执行登录操作,并将登录状态设置为 true。

import { ref } from 'vue';
export default {
  beforeRouteEnter(to, from, next) {
    // 在进入路由前执行登录操作
    // 假设登录成功后将登录状态设置为true
    isLoggedIn.value = true;
    next();
  },
  // 组件其他配置...
};

4.在其他需要登录才能访问的页面的组件内,使用 beforeRouteEnter 守卫来检查登录状态,如果用户未登录,则取消导航并重定向到登录页面。

import { ref } from 'vue';
export default {
  beforeRouteEnter(to, from, next) {
    // 检查登录状态
    if (!isLoggedIn.value) {
      next('/login'); // 重定向到登录页面
    } else {
      next(); // 继续路由导航
    }
  },
  // 组件其他配置...
};

通过以上步骤,您可以使用这四个守卫方法来实现登录功能。在全局前置守卫中检查登录状态,如果用户未登录且访问的是需要登录才能访问的页面,则取消导航并重定向到登录页面。在登录页面的组件内,使用 beforeRouteEnter 守卫来执行登录操作,并将登录状态设置为 true。在其他需要登录才能访问的页面的组件内,使用 beforeRouteEnter 守卫来检查登录状态,如果用户未登录,则取消导航并重定向到登录页面。

完整示例

下面是一个完整的实例代码,演示如何使用守卫来实现登录功能:

// main.js
import { createApp } from 'vue';
import App from './App.vue';
import { createRouter, createWebHistory } from 'vue-router';
const router = createRouter({
  history: createWebHistory(),
  routes: [
    {
      path: '/login',
      component: LoginComponent,
      meta: { requiresAuth: false } // 不需要登录才能访问
    },
    {
      path: '/dashboard',
      component: DashboardComponent,
      meta: { requiresAuth: true } // 需要登录才能访问
    },
    // 其他路由配置...
  ]
});
router.beforeEach((to, from, next) => {
  // 检查登录状态
  if (to.meta.requiresAuth && !isLoggedIn.value) {
    next('/login'); // 重定向到登录页面
  } else {
    next(); // 继续路由导航
  }
});
const app = createApp(App);
app.use(router);
app.mount('#app');
// LoginComponent.vue
import { ref } from 'vue';
export default {
  beforeRouteEnter(to, from, next) {
    // 在进入路由前执行登录操作
    // 假设登录成功后将登录状态设置为true
    isLoggedIn.value = true;
    next();
  },
  // 组件其他配置...
};
// DashboardComponent.vue
import { ref } from 'vue';
export default {
  beforeRouteEnter(to, from, next) {
    // 检查登录状态
    if (!isLoggedIn.value) {
      next('/login'); // 重定向到登录页面
    } else {
      next(); // 继续路由导航
    }
  },
  // 组件其他配置...
};

这个示例中,我们创建了一个简单的Vue应用,并使用Vue Router来管理路由。在路由配置中,我们定义了两个路由:/login和/dashboard。/login路由对应的组件是LoginComponent,不需要登录才能访问,/dashboard路由对应的组件是DashboardComponent,需要登录才能访问。

在全局前置守卫中,我们检查了路由的meta字段,如果requiresAuth为true且用户未登录,则重定向到登录页面。否则,继续路由导航。

在LoginComponent组件的beforeRouteEnter守卫中,我们模拟了登录操作,并将登录状态设置为true。

在DashboardComponent组件的beforeRouteEnter守卫中,我们检查了登录状态,如果用户未登录,则重定向到登录页面。

这样,我们就使用每个守卫来实现了登录功能

以上就是Vue3中导航守卫的使用教程的详细内容,更多关于Vue3导航守卫的资料请关注脚本之家其它相关文章!

相关文章

  • vue项目实现设置根据路由高亮对应的菜单项操作

    vue项目实现设置根据路由高亮对应的菜单项操作

    这篇文章主要介绍了vue项目实现设置根据路由高亮对应的菜单项操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • Vue字符串中如何添加多个空格

    Vue字符串中如何添加多个空格

    这篇文章主要介绍了Vue字符串中如何添加多个空格问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • vue.js添加一些触摸事件以及安装fastclick的实例

    vue.js添加一些触摸事件以及安装fastclick的实例

    今天小编就为大家分享一篇vue.js添加一些触摸事件以及安装fastclick的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-08-08
  • vue实现扫码功能

    vue实现扫码功能

    这篇文章主要为大家详细介绍了vue实现扫码功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-01-01
  • 基于vue中对鼠标划过事件的处理方式详解

    基于vue中对鼠标划过事件的处理方式详解

    今天小编就为大家分享一篇基于vue中对鼠标划过事件的处理方式详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-08-08
  • Vuex中this.$store.commit()和this.$store.dispatch()区别说明

    Vuex中this.$store.commit()和this.$store.dispatch()区别说明

    这篇文章主要介绍了Vuex中this.$store.commit()和this.$store.dispatch()区别说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-04-04
  • uniApp h5项目如何通过命令行打包并生成指定路径及文件名称

    uniApp h5项目如何通过命令行打包并生成指定路径及文件名称

    用uni-app来写安卓端,近日需要将程序打包为H5放到web服务器上,经过一番折腾,这里给大家分享下,这篇文章主要给大家介绍了关于uniApp h5项目如何通过命令行打包并生成指定路径及文件名称的相关资料,需要的朋友可以参考下
    2024-02-02
  • Vue3中Vuex状态管理学习实战示例详解

    Vue3中Vuex状态管理学习实战示例详解

    这篇文章主要为大家介绍了Vue3中Vuex状态管理学习实战示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • 傻瓜式vuex语法糖kiss-vuex整理

    傻瓜式vuex语法糖kiss-vuex整理

    kiss-vuex 是一个非常简单的语法糖类库,这篇文章主要介绍了傻瓜式vuex语法糖kiss-vuex整理,非常具有实用价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-12-12
  • Vue3 的响应式和以前有什么区别,Proxy 无敌?

    Vue3 的响应式和以前有什么区别,Proxy 无敌?

    这篇文章主要介绍了Vue3 的响应式和以前有什么区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05

最新评论