时间:2021-05-26
本文实例讲述了vue路由守卫+登录态管理。分享给大家供大家参考,具体如下:
在路由文件需要守卫的path后面加上meta
{path: '/home',component: home,meta:{requireAuth:true}}在main.js里面加上
//路由守卫router.beforeEach((to, from, next) => { console.log(to); console.log(from); if (to.meta.requireAuth) { // 判断该路由是否需要登录权限 if(JSON.parse(localStorage.getItem('islogin'))){ //判断本地是否存在access_token next(); }else { next({ path:'/login' }) } } else { next(); } if(to.fullPath == "/login"){ if(JSON.parse(localStorage.getItem('islogin'))){ next({ path:from.fullPath }); }else { next(); } }});其中islogin是登录态,就是true or false,true表示登录,false表示未登录,存放在localStorage里面,因为localStorage里面只能存字符串,所以存进去的时候需要localStorage.setItem(‘islogin',JSON.stringify(islogin));将islogin变为String类型,取出来的时候需要将islogin转化为Boolean类型,就比如JSON.parse(localStorage.getItem(‘islogin'))这样。
那么还有一个问题,就是islogin登录态的管理,vue不能实时监测localStorage的变化,需要实时监测islogin的变化来在页面显示登录还是已经登录,我用的是vuex+localStorage来管理islogin。展示部分代码
//store.js中import Vue from 'vue'import Vuex from 'vuex'Vue.use(Vuex)export default new Vuex.Store({ state:{ //是否登录判断 islogin:'' }, mutations:{ login:(state,n) => { //传入登录状态islogin let islogin = JSON.parse(n); localStorage.setItem('islogin',JSON.stringify(islogin)); console.log(islogin); state.islogin = islogin; } }}在需要改变登录态的页面只要触发上面这个login方法就可以了
//这里是登录login() { let flag = true; this.$store.commit('login',flag); this.$router.push("/home"); console.log("登录成功");}//这里是退出登录exit() { let flag = false; this.$store.commit('login',flag); this.$router.push("/login"); console.log("退出登录");}登录注册部分样式参考的element-ui
登录注册
<template> <div class="logReg"> <!-- 登录 --> <div class="login" v-show="flag"> <div class="login-title">登录</div> <el-form :model="ruleForm2" status-icon :rules="rules2" ref="ruleForm2" label-width="100px" class="login-ruleForm"> <el-form-item label="账号" prop="count2"> <el-input type="string" v-model="ruleForm2.count2" placeholder="请输入您的账号"></el-input> </el-form-item> <el-form-item label="密码" prop="pass2"> <el-input type="password" v-model="ruleForm2.pass2" autocomplete="off" placeholder="请输入您的密码"></el-input> </el-form-item> <el-form-item> <el-button type="primary" @click="submitForm2('ruleForm2')">提交</el-button> <el-button @click="resetForm2('ruleForm2')">重置</el-button> </el-form-item> </el-form> <div @click="register()" class="toregister" >没有账号?<span>立即注册</span></div> </div> <!-- 注册 --> <div class="register" v-show="!flag"> <div class="register-title">注册</div> <el-form :model="ruleForm1" status-icon :rules="rules1" ref="ruleForm1" label-width="100px" class="register-ruleForm"> <el-form-item label="账号" prop="count1"> <el-input type="string" v-model="ruleForm1.count1" placeholder="请输入您的账号"></el-input> </el-form-item> <el-form-item label="密码" prop="pass1"> <el-input type="password" v-model="ruleForm1.pass1" autocomplete="off" placeholder="请输入您的密码"></el-input> </el-form-item> <el-form-item label="确认密码" prop="checkPass"> <el-input type="password" v-model="ruleForm1.checkPass" autocomplete="off" placeholder="请确认您的密码"></el-input> </el-form-item> <el-form-item> <el-button type="primary" @click="submitForm1('ruleForm1')">提交</el-button> <el-button @click="resetForm1('ruleForm1')">重置</el-button> </el-form-item> </el-form> <div @click="register()" class="toregister" >已有账号?<span>立即登录</span></div> </div> </div></template><script> export default{ name:'logReg', data() { //登录账号验证 var validateCount2 = (rule, value, callback) => { if (value === '') { callback(new Error('请输入账号')); } else { if (value != "admin") { callback(new Error('账号不存在')); } //向后台请求验证账号是否存在 callback(); } }; //登录密码验证 var validatePass2 = (rule, value, callback) => { if (value === '') { callback(new Error('请输入密码')); } else { if (value != "admin") { callback(new Error('密码不正确')); } //向后台验证,也可以不处理 callback(); } }; //注册账号验证 var validateCount1 = (rule, value, callback) => { if (value === '') { callback(new Error('请输入账号')); } else { //向后台请求验证账号是否重复 callback(); } }; //注册密码验证 var validatePass1 = (rule, value, callback) => { if (value === '') { callback(new Error('请输入密码')); } else { if (this.ruleForm1.checkPass !== '') { this.$refs.ruleForm1.validateField('checkPass'); } callback(); } }; //注册密码确认 var validatePassCheck = (rule, value, callback) => { if (value === '') { callback(new Error('请再次输入密码')); } else if (value !== this.ruleForm1.pass1) { callback(new Error('两次输入密码不一致!')); } else { callback(); } }; return { flag:true,//登录注册切换 //登录账号密码 ruleForm2: { pass2: '', count2:'' }, //登录验证 rules2: { count2: [ { validator: validateCount2, trigger: 'blur' } ], pass2:[ { validator: validatePass2, trigger: 'blur' } ] }, ruleForm1: { count1: '', pass1: '', checkPass: '' }, rules1: { count1: [ { validator: validateCount1, trigger: 'blur' } ], pass1:[ { validator: validatePass1, trigger: 'blur' } ], checkPass: [ { validator: validatePassCheck, trigger: 'blur' } ] }, }; }, methods: { //登录提交 submitForm2(formName) { this.$refs[formName].validate((valid) => { if (valid) { console.log("提交成功"); //提交成功之后操作 let flag = true; this.$store.commit("login",flag); this.$router.push('/home'); this.$message({ message: '恭喜,登录成功', type: 'success' }); } else { this.$message({ message: '抱歉,登录失败', type: 'warning' }); return false; } }); }, //登录框重置 resetForm2(formName) { this.$refs[formName].resetFields(); }, //注册提交 submitForm1(formName) { this.$refs[formName].validate((valid) => { if (valid) { this.$message({ message: '恭喜,注册成功,请登录', type: 'success' }); this.flag = !this.flag; } else { this.$message({ message: '抱歉,注册失败', type: 'warning' }); return false; } }); }, //注册框重置 resetForm1(formName) { this.$refs[formName].resetFields(); }, //切换登录注册 register() { this.flag = !this.flag; } }, }</script><style scoped> .el-button--primary { color: #fff; background-color: rgba(254, 112, 26, 0.8); border-color: rgba(254, 112, 26, 0.9); } .el-button:focus{ color: #333; background-color: rgba(255, 255, 255, 0.1); border-color: #dcdfe6; } .el-button:hover{ color: rgba(254, 112, 26, 1); background-color: rgba(255, 255, 255, 0.1); border-color: rgba(254, 112, 26, 0.9); } .el-button--primary:hover { color: #fff; background-color: rgba(254, 112, 26, 0.8); border-color: rgba(254, 112, 26, 0.9); } .el-button--primary:focus { color: #fff; background-color: rgba(254, 112, 26, 0.8); border-color: rgba(254, 112, 26, 0.9); } .register, .login{ margin-top: 100px; margin-bottom: 100px; padding: 40px 0px 40px 0; background-color: #fff; width: 600px; margin: 100px auto; border-radius: 8px; box-shadow: 0px 0px 100px rgba(0,0,0,.1); } .register .register-title, .login .login-title{ font-size: 1.65rem; line-height: 60px; font-weight: bold; white-space: nowrap; margin-bottom: 16px; color: #555; } .register-ruleForm, .login-ruleForm{ width: 500px; margin: 0 auto; padding: 0px 100px 0px 0; } .login .toregister{ cursor: pointer; } </style>希望本文所述对大家vue.js程序设计有所帮助。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
什么是beforeEach?beforeEach是一个vue-router的路由导航钩子,一般我用它做路由守卫。什么是路由守卫?路由跳转前做一些验证,比如登录验
路由跳转前做一些验证,比如登录验证(未登录去登录页),是网站中的普遍需求。对此,vue-route提供的beforeRouteUpdate可以方便地实现导航守卫
最近在学习vue,感觉路由守卫这个地方知识点挺多的,而且很重要,所以,今天添加一点小笔记官方文档导航守卫其实也是路由守卫,也可以是路由拦截,我们可以通过路由拦截
今天给大家写一篇关于vue校验登录状态,如果是非法登录就跳转到登录页面的逻辑首先需要写一个路由守卫,它的原理是每次路由发生变化时触发具体写法如下:router.
简介主要用来通过跳转或取消的方式守卫导航。例如判断登录信息:没登录全部跳到登录页。判断必要操作是否进行没进行的话中断跳转。分为三大类:全局守卫、路由守卫、组件守