我的编程空间,编程开发者的网络收藏夹
学习永远不晚

vue中router.beforeEach()的简单用法举例

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

vue中router.beforeEach()的简单用法举例

导航守卫 主要是通过跳转或取消得方式守卫导航

在前端路由跳转中,路由跳转前都是会经过beforeEach,而beforeEach可以通过next来控制到底去哪个路由。根据这个特性我们就可以在beforeEach中设置一些条件来控制路由的重定向。

常见的使用场景有:

1、验证用户是否登录(若未登录,且当前非登录页面,则自动重定向登录页面);

2、用户权限;

3、用户输入的路路径是否存在,不存在的情况下如何处理,重定向到哪个页面。

此处呢我使用一个简单的例子:

当用户输入的路径不存在的情况下,将其重定向到‘/’路径来说明beforeEach是如何控制路由的。

话不多说,直接看下边如何实现的(这里我以创建一个名为router-be的项目为例)。

第一步 : 规定进入路由是否需要权限

@/router/index.js

import A from '@/components/a'
{
	path : '/a',
	name : 'a',
	component : A,
	meta : {  // 加一个自定义obj
		requireAuth : true   // 参数 true 代表需要登陆才能进入 A
	}
}

第二步 : 使用vuex 整一个useid

@/assets/store.js

//使用vuex三步走
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
//这个理论来说
const store = new Vuex.Store({
	state:{
		userId : ''
	}
})

export default store

第三步 : 使用router.beforeEach()

思路:【
	如果(进入这个路由需要权限){
	
		如果(能获取到这个用户的userID){
			就让这个用户进入这个路由
		}否则{
			就让这个用户进入b这个页面
		}
		
	} 即将进入的路由不需要权限就能进入 {
	
		就让这个用户进入这个路由
		
	}
】
对应代码:
import store from '@/assets/store'   //把这个userId获取过来
router.beforeEach((to,from,next)=>{
	if(to.meta.requireAuth){
		if(store.state.userId){
			next()
		}else{
			next({path:'/b'})
		}
	}else{
		next()
	}
})

实现原理

  • constrouter=newVueRouter({…})
  •  router.beforeEach((to,from,next)=>{// …})
  •  每个守卫方法接受三个参数 :

1.to => route : 即将进入的目标路由对象

2.from => route : 当前导航正要离开的路由

3.next => function: 一定要调用该方法来 resolve这个钩子,执行效果以来 next 方法的调用参数

第四步

  • 上一步 /b 路由为 登陆页面
  • 当进入A 页面之前,需要先请求接口,获取是否有登录,然后把userId存在vuex 的state 中
  • 当没有userId 时,则在登录之后,存一个userId 到state 里

第五步 项目中使用

router.beforeEach((to, from, next) => {
  console.log(to);

  // DEBUG: 测试
  return next();

  const { ldomain } = to.query;
  if (ldomain) {
    document.domain = ldomain;
  }

  const { LoginPage } = byskConfig;

  if (!router.getMatchedComponents(to.path).length) {
    console.log("not page", to, from);
    return next(byskConfig.NotFoundPage.path);
  }

  //验证权限
  if (to.meta.permId && !hasPerms(to.meta.permId)) {
    console.log("no auth", to, from);
    return next(LoginPage.path);
  }

  //验证是否登录
  if (to.meta.permId && !getCookie("sid")) {
    console.log("no login & signout", to, from);
    return next(LoginPage.path);
  }

  if (to.matched.length) {
    let parentRoute = to.matched[to.matched.length - 1].parent;
    if (
      parentRoute &&
      parentRoute.meta.hasOwnProperty("redirect") &&
      parentRoute.meta.redirect !== to.path) {
      parentRoute.meta.redirect = to.path;
    }
  }
  next();
});

权限

export function setupPermissionGuard(router) {
  router.beforeEach(async (to, from, next) => {
    const { state, commit, dispatch } = store;
    // TODO: 404 的处理

    // 不需要登录,可访问
    if (to.meta.ignoreAuth === true) {
      next();
      return;
    }

    // TODO: 白名单

    // 刷新重新登录
    if (!state.appToken) {
      await dispatch('relogin');
    }

    // 处理token
    const hasToken = !!state.appToken;

    if (!hasToken) { // 未登陆,或过期
      // 重定向到登录页
      const redirectData = {
        path: LOGIN_PATH,
        replace: true,
      };

      next(redirectData);
      return;
    }

    // 判断是否有权限
    const hasAuthority = to.meta.permId && hasPerms(to.meta.permId);

    if (hasAuthority) { // 权限验证
      if (to.meta.ignoreKeepAlive !== true) {
        // 页面需要缓存, 添加到缓存
        const { cachePages } = state;
        const { matched } = to;
        commit('setCachePages', [...cachePages, ...matched.slice(1)]);
      }

      next();
      return;
    }
    next(from.path);

    // next();
  });

  router.afterEach((to) => {
    if (to.meta?.label) {
      // 设置页面`title`
      document.title = `一立科技 - ${to.meta.label}`;
    }
  });
}

总结

到此这篇关于vue中router.beforeEach()的简单用法举例的文章就介绍到这了,更多相关vue router.beforeEach()用法内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

vue中router.beforeEach()的简单用法举例

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

vue中router.beforeEach()的简单用法举例

router.beforeEach()一般用来做一些进入页面的限制,比如没有登录,就不能进入某些页面,只有登录了之后才有权限查看某些页面,下面这篇文章主要给大家介绍了关于vue中router.beforeEach()的简单用法举例,需要的朋友可以参考下
2023-01-05

MySQLJSON索引用法举例简单介绍

MySQLJSON索引的使用指南:MySQLJSON数据类型支持使用JSON索引提高查询性能。可以通过在JSON文档的特定键或键路径上创建索引来实现,快速查找和访问数据。语法:CREATEINDEXindex_nameONtable_name(column_name)USINGJSON(key_path)。MySQL支持Hash索引(精确匹配)和Spatial索引(地理位置数据查询)。选择合适的索引取决于查询模式和数据结构。JSON索引可以显著提升查询效率,但需注意创建索引的限制和最佳实践。
MySQLJSON索引用法举例简单介绍
2024-04-02

VUE中$refs的基本用法举例

ref加在子组件上,用this.$refs.(ref值)获取到的是组件实例,可以使用组件的所有方法, 在使用方法的时候直接this.$refs.(ref值).方法()就可以使用了,这篇文章主要介绍了VUE中$refs的基本用法,需要的朋友可以参考下
2022-12-19

举例简单讲解Python中的数据存储模块shelve的用法

shelve类似于一个key-value数据库,可以很方便的用来保存Python的内存对象,其内部使用pickle来序列化数据,简单来说,使用者可以将一个列表、字典、或者用户自定义的类实例保存到shelve中,下次需要用的时候直接取出来,就
2022-06-04

举例讲解Android应用中SimpleAdapter简单适配器的使用

SimpleAdapter,跟名字一样,一个简单的适配器,既为简单,就只是被设计来做简单的应用的,比如静态数据的绑定,不过仍然有自定义的空间,比如说在每一个ListItem中加一个按钮并添加响应事件.首先还是先看一下SimpleAdapte
2022-06-06

Android中SurfaceView用法简单实例

本文实例讲述了Android中SurfaceView用法。分享给大家供大家参考,具体如下: 这里贴上一个小程序代码,主要运用SurfaceView来实现在屏幕上画一个圆,你可以通过按方向键和触摸屏幕来改变圆的位置 代码: Activity:
2022-06-06

python中注释用法简单示例

注释即对程序代码的解释,在写程序时需适当使用注释,以方便自己和他人理解程序各部分的作用,下面这篇文章主要给大家介绍了关于python中注释用法的相关资料,需要的朋友可以参考下
2023-02-04

Android开发中CheckBox的简单用法示例

本文实例讲述了Android开发中CheckBox的简单用法。分享给大家供大家参考,具体如下: CheckBox是一种在界面开发中比较常见的控件,Android中UI开发也有CheckBox,简单的说下它的使用,每个CheckBox都要设置
2022-06-06

Android开发中ProgressDialog简单用法示例

本文实例讲述了Android开发中ProgressDialog简单用法。分享给大家供大家参考,具体如下:网上一般对进度条的示例都是如何显示,没有在任务结束如何关闭的文章,参考其他文章经过试验之后把整套进度条显示的简单示例如下:建立andro
2023-05-30

JS中let的基本用法举例

ES6新增了let命令,用来声明变量,它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效,下面这篇文章主要给大家介绍了关于JS中let的基本用法,需要的朋友可以参考下
2023-01-05

c语言中putchar的用法举例

putchar() 函数用于向标准输出设备写入单个字符。其用法步骤如下:包含 头文件。定义一个表示要写入字符的整数变量。使用 putchar() 函数向控制台打印字符。putchar() 函数在 C 语言中的用法putchar() 函数
c语言中putchar的用法举例
2024-05-02

Android中资源文件用法简单示例

本文实例讲述了Android中资源文件用法。分享给大家供大家参考,具体如下: 一、XML文件间资源文件的使用 引用格式:attribute="@[packagename:]resourcetype/resourceidentifier"ex
2022-06-06

mysql中insert语句的5种用法简单示例

目录前言一、values参数后单行插入二、valuejss参数后多行插入三、搭配select插入数据四、复制旧表的信息到新表五、搭配set插入数据总结前言insert语句是标准sql中的语法,是插入数据的意思。在实际应用中,它也演变了很多
2023-08-19

C++中const的简单用法

C++是C语言的继承,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计。C++擅长面向对象程序设计的同时,还可以进行基于过程的程序设计,因而C++就适应
2023-06-03

Android中AnimationDrawable使用的简单实例

首先,可以在drawable文件夹下定义一个xml的文件。如下所示:代码如下:
2022-06-06

编程热搜

目录