Vue 导航守卫

导航守卫可以控制路由的访问权限,主要是用来监听路由的进入和离开。

当进入或离开路由组件时,可以通过导航守卫做一些拦截,实现权限登录等功能。

导航守卫分为三种:全局守卫、独享守卫、组件守卫。

参数说明:

每个导航守卫都有三个参数,全局后置守卫 afterEach 除外。

to 表示即将要进入的路由对象

例如:要前往Home页面,那么to就是Home页面的路由信息

from 表示即将要离开的路由对象

例如:当前在Login页面,要前往Home页面,那么from就是Login页面的路由信息

next 表示是否放行

next() 表示放行

next(false) 表示不放行

next('/login') 表示进入Login页面【path方式】

next({name: 'login'}) 表示进入Login页面【name方式】

全局前置守卫【常用】

一、分别创建 Login.vue、Home.vue、About.vue 这三个路由组件。

html 复制代码
<template>
    <div>
        <h1>Login页面</h1>
        <button @click="isHome">登录</button>
    </div>
</template>

<script>
export default {
    name: "Login",
    methods: {
        isHome() {
            sessionStorage.setItem('uid', 10);
            this.$router.push('/');
        }
    }
}
</script>
html 复制代码
<template>
    <div>
        <h1>Home页面</h1>
        <button @click="isAbout">前往About页面</button>
        <br /><br />
        <button @click="isBack">退出登录</button>
    </div>
</template>

<script>
export default {
    name: "Home",
    methods: {
        isAbout() {
            this.$router.push('/about');
        },
        isBack() {
            sessionStorage.removeItem('uid');
            this.$router.push('/login');
        }
    }
}
</script>
html 复制代码
<template>
    <div>
        <h1>About页面</h1>
        <button @click="isHome">前往Home页面</button>
    </div>
</template>

<script>
export default {
    name: "About",
    methods: {
        isHome() {
            this.$router.push('/');
        }
    }
}
</script>

二、在 router 目录下的 index.js 文件中配置全局前置守卫。

javascript 复制代码
import Vue from 'vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter)

import Home from '../views/Home.vue'
import About from '../views/About.vue'
import Login from '../views/Login.vue'

const routes = [
  {
    path: '/',
    name: 'home',
    component: Home
  },
  {
    path: '/about',
    name: 'about',
    component: About
  },{
    path: '/login',
    name: 'login',
    component: Login
  }
]

const router = new VueRouter({
  routes
})

// 全局前置守卫
// 初始化的时候会被调用、每次路由切换之前会被调用
router.beforeEach((to,from,next) => {
  if(to.name === 'home' || to.name === 'about'){
    if(sessionStorage.getItem('uid')){
      next();
    }else{
      next('/login');
    }
  }else{
    next();
  }
})

export default router

备注:以上表示如果前往 Home.vue 页面或 About.vue 页面,就会判断是否有 uid,如果没有就前往 Login.vue 页面,如果有 uid 就正常跳转。

三、使用 mate 路由元信息,配合导航守卫判断是否需要权限验证。

javascript 复制代码
import Vue from 'vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter)

import Home from '../views/Home.vue'
import About from '../views/About.vue'
import Login from '../views/Login.vue'

const routes = [
  {
    path: '/',
    name: 'home',
    component: Home,
    // 自定义信息,isAuth为true表示需要权限
    meta:{ isAuth: true }
  },
  {
    path: '/about',
    name: 'about',
    component: About,
    // 自定义信息,isAuth为true表示需要权限
    meta:{ isAuth: true }
  },{
    path: '/login',
    name: 'login',
    component: Login
  }
]

const router = new VueRouter({
  routes
})

// 全局前置守卫
// 初始化的时候会被调用、每次路由切换之前会被调用
router.beforeEach((to,from,next) => {
  // 判断是否需要权限
  if(to.meta.isAuth){
    if(sessionStorage.getItem('uid')){
      next();
    }else{
      next('/login');
    }
  }else{
    next();
  }
})

export default router

注意:mate 属性表示路由元信息,这个对象里的内容由我们来定义,用于配置一些自定义信息。

四、全局前置守卫总结

javascript 复制代码
router.beforeEach((to,from,next) => {
  if(判断是否需要权限){
    // 权限处理...
  }else{
    next();
  }
})

原创作者:吴小糖

创作时间:2023.8.12

相关推荐
GIS数据转换器8 分钟前
智慧林草“一张图“平台
java·大数据·服务器·前端·javascript·数据库·人工智能
2401_8858850412 分钟前
国际语音php接口代码示例:PHP使用cURL快速调用语音发送API
android·开发语言·前端·人工智能·python·php·语音识别
leoZ23112 分钟前
AI+前端提效-08 AI自动化文档:前端组件、接口、项目文档自动生成
前端·人工智能·深度学习·神经网络·目标检测·自然语言处理·自动化
lilian23317 分钟前
HarmonyOS 7 新特性(五)|ContainerReader 容器断点与自适应布局
前端·华为·harmonyos
计算机魔术师30 分钟前
Google DeepMind 将 AI 科学家 Co-Scientist 扩展为实验室集成研究伙伴
前端
2601_9657984740 分钟前
BrandBoost WordPress Theme Review: Fast Agency Web Architecture
前端
律宏阔42 分钟前
Electron 集成 Drizzle + SQLite 踩坑笔记
前端
律宏阔1 小时前
Electron preload.ts 类型无法自动推导的解决方案
前端
烂蜻蜓1 小时前
Flask入门教程(十):静态文件——CSS、JS与图片的正确管理方式
javascript·css·flask
名字还没想好☜1 小时前
kubectl 排障实战:jsonpath 精准取值、custom-columns、events 排序与 top 速查
运维·前端·chrome·docker·kubernetes