vuex实现登录状态的存储,未登录状态不允许浏览的方法


Posted in Javascript onMarch 09, 2018

基础思路就是使用vuex状态管理来存储登录状态(其实就是存一个值,例如token),然后在路由跳转前进行登录状态的判断,可以使用vue-router的全局前置守卫beforeEach,也可以使用路由独享的守卫beforeEnter。

导航守卫

正如其名,vue-router``` 提供的导航守卫主要用来通过跳转或取消的方式守卫导航。有多种机会植入路由导航过程中:全局的, 单个路由独享的, 或者组件级的。 记住参数或查询的改变并不会触发进入/离开的导航守卫。你可以通过观察 $route 对象来应对这些变化,或使用beforeRouteUpdate的组件内守卫。

完整的导航解析流程

1、导航被触发。

2、在失活的组件里调用离开守卫。

3、调用全局的 beforeEach 守卫。

4、在重用的组件里调用 beforeRouteUpdate 守卫 (2.2+)。

5、在路由配置里调用 beforeEnter。

6、解析异步路由组件。

7、在被激活的组件里调用 beforeRouteEnter。

8、调用全局的 beforeResolve 守卫 (2.5+)。

9、导航被确认。

10、调用全局的 afterEach 钩子。

11、触发 DOM 更新。

12、用创建好的实例调用 beforeRouteEnter 守卫中传给 next 的回调函数。

全局守卫

你可以使用 router.beforeEach注册一个全局前置守卫

const router = new VueRouter({ ... })
router.beforeEach((to, from, next) => {
 // ...
})

当一个导航触发时,全局前置守卫按照创建顺序调用。守卫是异步解析执行,此时导航在所有守卫 resolve 完之前一直处于 等待中。

每个守卫方法接收三个参数:

to: Route:即将要进入的目标 路由对象

from: Route:当前导航正要离开的路由

next: Function:一定要调用该方法来 resolve 这个钩子。执行效果依赖 next 方法的调用参数。

next():进行管道中的下一个钩子。如果全部钩子执行完了,则导航的状态就是 confirmed (确认的)。

next(false):中断当前的导航。如果浏览器的 URL 改变了(可能是用户手动或者浏览器后退按钮),那么 URL 地址会重置到 from 路由对应的地址。

next('/')或者next({ path: '/' }): 跳转到一个不同的地址。当前的导航被中断,然后进行一个新的导航。

next(error):(2.4.0+) 如果传入 next 的参数是一个 Error 实例,则导航会被终止且该错误会被传递给 router.onError()注册过的回调。

确保要调用 next 方法,否则钩子就不会被 resolved。

路由独享的守卫

你可以在路由配置上直接定义beforeEnter守卫:

const router = new VueRouter({
 routes: [
  {
   path: '/foo',
   component: Foo,
   beforeEnter: (to, from, next) => {
    // ...
   }
  }
 ]
})

还有其他部分守卫,详情可以看官方文档https://router.vuejs.org/zh-cn/advanced/navigation-guards.html

安装vuex后

创建store.js

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex);
const state = {
  isLogin: 0
}
const mutations = {
  changeLogin(state,status){
    state.isLogin = status;
  }
}
const actions = {
  loginAction({commit}){
    commit('changeLogin',1);
  }
}
export default new Vuex.Store({
  state,
  actions,
  mutations
})

login.vue中

引入import { mapActions,mapState } from 'vuex'

接着进行登录状态的改变,base_url就是路径

export default {
    name: 'Login',
    data(){
      return{
        loginForm: {
          username: '',
          password: '',
        },
        rules: {
          username: [
            { required: true, message: '请输入用户名', trigger: 'blur' },
          ],
          password: [
            { required: true, message: '请输入密码', trigger: 'blur' }
          ],
        },
        showLogin: false
      }
    },
    mounted(){
      this.showLogin = true;
    },
    computed: {
      ...mapState(['isLogin'])
    },
    methods: {
      ...mapActions(['loginAction']),
      submitForm(formName){
        this.$refs[formName].validate((valid) => {
          if(valid){
            if(this.loginForm.username == 'aaa' && this.loginForm.password == '111'){
              console.log('验证通过');
              this.loginAction();
              this.$router.push('manage');
            }else{
              console.log('账号密码出错');
              // this.$message.error('账号密码出错');
              this.$message({
                type: 'error',
                message: '账号密码出错'
              });
            }
            console.log('请求地址: ' + base_url);
          }else{
            console.log('验证失败');
            return false;
          }
        })
      }
    }
  }

接下去只要使用路由守卫即可

beforeEach使用实例

router.beforeEach((to,from,next)=>{
  if(to.meta.check){
    var check = async function(){
      const result = await checkUser();
      if(result.status == 0){
        next();
      }else{
        alert('用户未登录');
        next({path: '/login'});
      }
    }
    check(); //后台验证session
  }else{
    next();
  }
})

beforeEnter使用实例

export default new Router({
  routes: [
    {
     path: '/login',
     component: Login
    },
    {
      path: '/manage',
      name: '',
      component: Manage,
      beforeEnter: (to,from,next)=> {  //导航守卫
      console.log(to)
      console.log(from)
      if(store.state.isLogin == 1){
       console.log('用户已经登录');
       next();
      }else{
       console.log('用户未登录');
       next({path: '/login',query:{ Rurl: to.fullPath}}); //未登录则跳转到登陆界面,query:{ Rurl: to.fullPath}表示把当前路由信息传递过去方便登录后跳转回来
     }
   } 
    }
   ]
})

以上这篇vuex实现登录状态的存储,未登录状态不允许浏览的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
学习YUI.Ext 第四天--对话框Dialog的使用
Mar 10 Javascript
JavaScript高级程序设计(第3版)学习笔记2 js基础语法
Oct 11 Javascript
JavaScript模块随意拖动示例代码
May 27 Javascript
关于Javascript加载执行优化的研究报告
Dec 16 Javascript
浅谈javascript中call()、apply()、bind()的用法
Apr 20 Javascript
jquery实用技巧之输入框提示语句
Jul 28 Javascript
原生JavaScript实现精美的淘宝轮播图效果示例【附demo源码下载】
May 27 Javascript
使用vue构建移动应用实战代码
Aug 02 Javascript
浅谈Vue数据绑定的原理
Jan 08 Javascript
mpvue全局引入sass文件的方法步骤
Mar 06 Javascript
Vue实现根据hash高亮选项卡
May 27 Javascript
JS Html转义和反转义(html编码和解码)的实现与使用方法总结
Mar 10 Javascript
详解react关于事件绑定this的四种方式
Mar 09 #Javascript
vue+vuex+axios实现登录、注册页权限拦截
Mar 09 #Javascript
Vue2.0结合webuploader实现文件分片上传功能
Mar 09 #Javascript
vue + vuex todolist的实现示例代码
Mar 09 #Javascript
vue实现在表格里,取每行的id的方法
Mar 09 #Javascript
vue移动端UI框架实现QQ侧边菜单组件
Mar 09 #Javascript
vue的安装及element组件的安装方法
Mar 09 #Javascript
You might like
php中的一个中文字符串截取函数
2007/02/14 PHP
php基础教程 php内置函数实例教程
2012/08/21 PHP
php使用smtp发送支持附件的邮件示例
2014/04/13 PHP
php中输出json对象的值(实现方法)
2018/03/07 PHP
PHP实现的简单路由和类自动加载功能
2018/03/13 PHP
PJBlog插件 防刷新的在线播放器
2006/10/25 Javascript
js下用gb2312编码解码实现方法
2009/12/31 Javascript
jQuery学习笔记之jQuery的动画
2010/12/22 Javascript
JS 实现导航栏悬停效果(续2)
2013/09/24 Javascript
详解jQuery插件开发中的extend方法
2013/11/19 Javascript
JS,Jquery获取select,dropdownlist,checkbox下拉列表框的值(示例代码)
2014/01/11 Javascript
JS是按值传递还是按引用传递
2015/01/30 Javascript
jQuery匹配文档链接并添加class的方法
2015/06/26 Javascript
JS仿淘宝实现的简单滑动门效果代码
2015/10/14 Javascript
基于layer.js实现收货地址弹框选择然后返回相应的地址信息
2017/05/26 Javascript
JS寄快递地址智能解析的实现代码
2020/07/16 Javascript
Antd的table组件表格的序号自增操作
2020/10/27 Javascript
Python判断两个对象相等的原理
2017/12/12 Python
python检索特定内容的文本文件实例
2018/06/05 Python
Django跨域请求CSRF的方法示例
2018/11/11 Python
Python爬虫动态ip代理防止被封的方法
2019/07/07 Python
pandas数据处理进阶详解
2019/10/11 Python
Pandas DataFrame中的tuple元素遍历的实现
2019/10/23 Python
详解java调用python的几种用法(看这篇就够了)
2020/12/10 Python
汤米巴哈马官方网站:Tommy Bahama
2017/05/13 全球购物
ZWILLING双立人法国网上商店:德国刀具锅具厨具品牌
2019/08/28 全球购物
JSF的标签库有哪些
2012/04/27 面试题
银行实习鉴定
2013/12/13 职场文书
公司股权转让协议书
2014/04/12 职场文书
小学生关于梦想的演讲稿
2014/08/22 职场文书
党员活动总结
2015/02/04 职场文书
golang 如何用反射reflect操作结构体
2021/04/28 Golang
Python爬虫基础初探selenium
2021/05/31 Python
python生成可执行exe控制Microsip自动填写号码并拨打功能
2021/06/21 Python
Django + Taro 前后端分离项目实现企业微信登录功能
2022/04/07 Python
详解Android中的TimePickerView(时间选择器)的用法
2022/04/30 Java/Android