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

相关推荐
yqcoder21 小时前
CSS 迷思破解:`:nth-child` vs `:nth-of-type`
前端·css
时寒的笔记21 小时前
某陆飞11期_webpack案例
前端·webpack·node.js
漫游的渔夫21 小时前
前端开发者做多步 Agent:别让 AI 边想边乱跑,用 Plan-Act-Observe 稳住 4 步任务
前端·人工智能·typescript
武帝为此1 天前
【Selenium 执行 JavaScript】
javascript·selenium·测试工具
一锤捌拾1 天前
V8引擎精品漫游指南--Ignition篇(下 一) 动态执行前的事情
前端·javascript
遇见~未来1 天前
第六篇_CSS进阶_深入浏览器与工程化
前端·css·rust
Cache技术分享1 天前
397. Java 文件操作基础 - 创建常规文件与临时文件
前端·后端
Daybreak1 天前
Vercel Serverless 调国内 AI 接口 504?Edge Runtime 救了我
前端
Elastic 中国社区官方博客1 天前
用于 JavaScript 和 TypeScript 的 ES|QL 查询构建器:流式、类型安全的查询构建
大数据·javascript·数据库·elasticsearch·搜索引擎·typescript·全文检索
zubylon1 天前
Ollama 本地起一个开发助手
前端·人工智能