当前位置: 首页 > news >正文

vue2 和 vue3 的 路由守卫

vue2 路由守卫:

vue-router 路由实现:
路由就是用来跟后端服务器进行交互的一种方式,通过不同的路径,来请求不同的资源,请求不同的页面是路由的其中一种功能。
首先知道有3个参数 to , from, next (意义:
to是即将要进入的目标路由对象,
from 是当前导航即将要离开的路由对象,
next调用该方法后,才能进入下一个钩子函数afterEach )

next() // 直接进入to所指的路由
next(false) // 中断当前路由
next(‘route’) // 跳转指定路由
next(‘error’) // 跳转错误路由

1 全局守卫: this.$router.beforeEach((to, from, next) =>{next(); })
执行之前触发beforeEach(to,from,next),执行后触发router.afterEach(to, from);

2 路由独享守卫: this.$route.beforeEnter(to, from ,next());

3 组件内部的守卫: 
路由进入之前 beforeRouteEnter(to, from, next())
路由更新之前 beforeRouteUpdate(to, from, next())
路由离开之前 beforeRouteLeave(to, from, next())

看下示例
vue2 中写入全局的路由守卫,一般就直接在router.index 页面完成。

import Vue from 'vue';
import Router from 'vue-router';

Vue.use(Router)

const router = new Router({
 routes: [
	 path: '/', // 默认进入路由
	   redirect: '/home'  //重定向
	  },
	  {
	   path: '/login',
	   name: 'login',
	   component: LoginPage
	  },....
	]
 })
 
 router.beforeEach((to, from, next) => {
	 console.log('初始化就执行全局路由守卫');
	 // to: Route: 即将要进入的目标 路由对象
	 // from: Route: 当前导航正要离开的路由
	 // next: Function: 一定要调用该方法来 resolve 这个钩子。执行效果依赖 next 方法的调用参数。

	 const nextRoute = ['home', '....'];		
	 let isLogin = global.isLogin; // 是否登录
	 // 未登录状态;当路由到nextRoute指定页时,跳转至login
	 if (nextRoute.indexOf(to.name) >= 0) { 
	  if (!isLogin) {
	   router.push({ name: 'login' })
	  }
	 }
	 // 已登录状态;当路由到login时,跳转至home 
	 if (to.name === 'login') {
	  if (isLogin) {
	   router.push({ name: 'home' });
	  }
	 }
	 next();
	});
	// 或者这样写  全局路由守卫
	// router.beforeEach((to, from, next) => {
    //  const isLogin = localStorage.ele_login ? true : false;
	//   if (to.path == '/login') {
	//    next();
	 //  } else {
	// 是否在登录状态下
	//    isLogin ? next() : next('/login');
	//  }
	// });
	
	export default router;

假设我们执行了跳转登录页面
login.vue页面内部
当点击登录按钮时

 handleLogin() { // 发送请求
      this.$axios
        .post("/api/posts/goxxx", {
          phone: this.phone, // 参数
          code: this.verifyCode // 参数
        })
        .then(res => {
          // console.log(res);
          // 检验成功 设置登录状态并且跳转到/
          localStorage.setItem("ele_login", true);
          this.$router.push("/"); // 进入首页
        })
        .catch(err => {
          // 返回错误信息
          this.errors = {
            code: err.response.data.msg
          };
        });
    },

vue2独享路由守卫

就是某一个路由所单独享用的路由守卫。

官方定义是这样说的:你可以在路由配置上直接定义 beforeEnter 守卫,这些守卫与全局前置守卫的方法参数是一样的。
给个模拟的需求 当path路径名必须是xinxi才可以进行访问
我们在路由页面中

{
    name: 'xinxi',
    path: 'news', // 注意路由底层给你加了 '/' ,如果自己加 '/' 有可能还显示不出效果
    component:News,
    meta:{isAuth:true,title:'信息'},
    beforeEnter: (to,from,next)=>{
        //里面的内容跟全局前置路由守卫一样的代码
        console.log('beforeEnter',to,from,next)
        if(to.meta.isAuth){
            if(localStorage.getItem('school') === 'xinxi'){
                next()
            }else{
                alert('权限不够用')
            }
        }else{
            next()
        }
    }
},
注意 :独享路由守卫只有前置你,没有后置。独享的路由守卫可以和全局后置路由守卫配合在一起(可以随意的组合)

组件内部守卫

  //通过路由规则进入该组件时候被调用
  beforeRouteEnter(to, from, next) {
    let data
    console.log(to, from)
    if (from.name === 'buildingDeoMonitor') {
      if (sessionStorage.getItem('navData') != null) {
        data = JSON.parse(sessionStorage.getItem('navData'))
        next(vm => {
          vm.navFormInfo.data = data
        })
      } else {
        next()
      }
    } else {
      next()
    }
  },

假设我们要离开某个页面就要看是否要清除的缓存或者判断
// 路由离开之前
 beforeRouteLeave(to, from, next) {
    // 判断要跳转哪个页面 从而清除缓存
    sessionStorage.removeItem("treelist");
    sessionStorage.removeItem("orgid");
    next();
  },
  再或者
   beforeRouteLeave(to, from, next) {
    // 判断是否提交
    if (this.action == 1) {
      // 判断往哪里跳转
      if (to.path.indexOf("dataitem") != -1) {
        if (this.issubmit > 1) {
          sessionStorage.setItem("eauForm", JSON.stringify(this.ruleForm));
          next();
        } else {
          this.ismess = true;
          this.success = 3;
          this.message = this.$t("phrase.saveEneFirst");
        }
      } else {
        next();
      }
    } else {
      next();
    }
  },

vue2的也就结束了
vue3 和这些几乎是一样的。唯一不同的是就是组件内部的路由守卫
在这里插入图片描述也就是说 onBeforeRouteLeave、onBeforeRouteUpdate是vue-router提供的两个composition api,它们只能被用于setup中。

import { onBeforeRouteLeave, onBeforeRouteUpdate } from 'vue-router';
export default {
  setup() {
     onBeforeRouteLeave((to,from)=>{//离开当前的组件,触发
        alert('我离开啦')
    })
    onBeforeRouteUpdate((to,from)=>{//当前组件路由改变后,进行触发
        console.log(to);
    })
  }
}

值得注意的是 路由进入之前 beforeRouteEnter并没有变,也不用写在setup内部。

	export default defineComponent({
	    setup() {
	        let obj=reactive({
	            name:'张三',
	        })
	        return {obj}
	    },
	    beforeRouteEnter(to, from, next) {
	        console.log(to);  //上一个页面前往的的页面(当前页面)
	        console.log(from);//来自哪一个页面
	        next((e:any) => {
	            // 这个回调参数e,包含setup中暴露出去的数据以及内置方法
	            window.console.log(e)
	            // 获取是否来自home1页面
	            if(from.path=='/home1'){
	                e.obj.name='李四'
	            }
	        })
	    },
	})

你学废了吗,欢迎指正,欢迎指正。

相关文章:

  • Android EventBus 3.0.0 使用总结
  • vue3 中vuex状态管理
  • 用过属性来给标签加样式
  • vue2和vue3 的 keep-alive的用法
  • php地址赋值值和传值赋值
  • vue3 Uncaught (in promise) TypeError: Cannot read properties of undefined 其实是解构赋值的问题
  • __new__方法
  • 动态样式绑定--style 和 class
  • Java多线程之Lock的使用(一)
  • vue项目 移动端 实现购物车功能
  • 火柴棒等式(2008年NOIP全国联赛提高组)
  • 如何用几何画板动态演示电饭锅工作原理
  • git 撤回 (git版本回退处理)
  • 好用的开发工具
  • 前端 重写 toFixed 方法并封装(不采用银行家算法返回正常数字类型)
  • 《深入 React 技术栈》
  • 〔开发系列〕一次关于小程序开发的深度总结
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • docker-consul
  • ES6之路之模块详解
  • JAVA之继承和多态
  • Linux中的硬链接与软链接
  • orm2 中文文档 3.1 模型属性
  • React+TypeScript入门
  • SQLServer之创建显式事务
  • 阿里云应用高可用服务公测发布
  • 编写符合Python风格的对象
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 从零开始学习部署
  • 简单数学运算程序(不定期更新)
  • 如何设计一个比特币钱包服务
  • 如何在GitHub上创建个人博客
  • 一个完整Java Web项目背后的密码
  • 直播平台建设千万不要忘记流媒体服务器的存在 ...
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • ​一些不规范的GTID使用场景
  • !!java web学习笔记(一到五)
  • # 计算机视觉入门
  • #define、const、typedef的差别
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (¥1011)-(一千零一拾一元整)输出
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (4.10~4.16)
  • (二)丶RabbitMQ的六大核心
  • (原)Matlab的svmtrain和svmclassify
  • *上位机的定义
  • ../depcomp: line 571: exec: g++: not found
  • .so文件(linux系统)
  • :“Failed to access IIS metabase”解决方法
  • [ 英语 ] 马斯克抱水槽“入主”推特总部中那句 Let that sink in 到底是什么梗?
  • [ 转载 ] SharePoint 资料
  • [HackMyVM]靶场 VivifyTech
  • [IE 技巧] 显示/隐藏IE 的菜单/工具栏
  • [JS真好玩] 掘金创作者必备: 监控每天是谁取关了你?
  • [LeetCode]—Permutations 求全排列