Vue 401配合Vuex防止多次弹框的案例


Posted in Javascript onNovember 11, 2020

1.安装Vuex

npm install vuex --save

2. 新建store目录结构

Vue 401配合Vuex防止多次弹框的案例

3. 编辑store.js

import Vuex from 'vuex'
import Vue from 'vue'
import defaultState from './state/state'
import mutations from './mutations/mutations'
import getters from './getters/getters'
import actions from './actions/actions'
 
Vue.use(Vuex)
 
// 开发环境
const isDev = process.env.NODE_ENV === 'development'
 
export default new Vuex.Store({
 strict: isDev, // 开发环境中使用严格模式,防止给Vuex的状态对象直接赋值
 state: defaultState,
 mutations,
 getters,
 actions
})

4. 编辑state.js

export default {
 tokenStatus: true, // token状态
}

5. 编辑mutations.js

export default {
 updateTokenStatus (state, bool) {
  state.tokenStatus = bool
 }
}

PS: getters用于计算属性,actions用于异步操作(暂无使用)

6. 挂载到vue根目录下,编辑main.js

import store from './store/store'
 
new Vue({
 store,
 router,
 render: h => h(App)
}).$mount('#app')

7. login 登录时,改变state.tokenStatus的值

import { mapMutations } from 'vuex' 
methods: {
  // 声明Vuex的mutations的方法
  ...mapMutations(['updateTokenStatus']),
  // 登录方法
  login () {
    ......
    // 改变Vuex.state.tokenStatus的值
    this.updateTokenStatus(true)
  }
}

8. 配置axios的错误判断

// 初始化用户信息
  initUserInfo () {
   const p1 = this.$api.user.getUserInfo()
   p1.then(result => {
    this.data = result
    this.isEdit = false
    this.firstLoading = false
   }).catch(reason => {
    this.firstLoading = false
    this.isEdit = false
    // 目前后端是通过code为-1,返回错误信息
    if (parseInt(reason.code) === -1) {
     this.$alert(reason.message, '提示', { type: 'error' })
    }
   })
  },

9. 拦截响应, 处理401,返回自定义错误

import router from '../../router'
import axios from 'axios'
import localStorage from 'localStorage'
import { MessageBox } from 'element-ui'
import store from '../../store/store'
 
// http response 拦截器
axios.interceptors.response.use(
 response => {
  return response
 },
 error => {
  if (error.response) {
   if (error.response.status === 401) {
    switch (error.response.status) {
     case 401:
      const route = localStorage.getItem('vip_entrance')
      router.replace({
       path: route,
       query: { redirect: router.currentRoute.fullPath }
      })
      if (store.state.tokenStatus) {
       // 饿了么框架弹框
       MessageBox.alert('登录超时!', '提示', { type: 'error' })
       // 修改tokenStatus状态,防止多次点击
       store.commit('updateTokenStatus', false)
      }
      const data = {
       code: 1
      }
      return Promise.reject(data)
    }
   }
  }
  return Promise.reject(error.response.data)
 }
)

补充知识:vue 配置vuex在严格模式下出现是问题

我就废话不多说了,大家还是直接看代码吧~

需要关闭严格模式,不然会报错

import Vue from "vue";
import Vuex from "vuex";
import createPersistedState from "vuex-persistedstate";
import * as Cookies from "js-cookie";
import user from "./modules/user";
import myCen from "./modules/myCen";
import registered from "./modules/registered";
Vue.use(Vuex);

export default new Vuex.Store({
 strict: false, //关闭严格模式
 modules: {
  user,
  myCen,
  registered
 },
 // 持久化储存
 plugins: [ 
  createPersistedState({
   storage: {
    getItem: key => Cookies.get(key),
    setItem: (key, value) => Cookies.set(key, value, { expires: 7 }),
    removeItem: key => Cookies.remove(key)
   }
  })
 ]
});

以上这篇Vue 401配合Vuex防止多次弹框的案例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery 指南/入门基础
Nov 30 Javascript
CCPry JS类库 代码
Oct 30 Javascript
对xmlHttp对象的理解
Jan 17 Javascript
Javascript解析URL方法详解
Dec 05 Javascript
js实现最短的XML格式化工具实例
Mar 12 Javascript
JS拖拽插件实现步骤
Aug 03 Javascript
JavaScript计划任务后台运行的方法
Dec 18 Javascript
对jquery的ajax进行二次封装以及ajax缓存代理组件:AjaxCache详解
Apr 11 Javascript
第二次聊一聊JS require.js模块化工具的基础知识
Apr 17 Javascript
js实现tab选项卡切换功能
Jan 13 Javascript
浅谈vue的几种绑定变量的值 防止其改变的方法
Mar 01 Javascript
koa-router路由参数和前端路由的结合详解
May 19 Javascript
VUE-ElementUI 自定义Loading图操作
Nov 11 #Javascript
在elementui中Notification组件添加点击事件实例
Nov 11 #Javascript
vue.js+element 默认提示中英文操作
Nov 11 #Javascript
Vue 解决在element中使用$notify在提示信息中换行问题
Nov 11 #Javascript
vue 实现element-ui中的加载中状态
Nov 11 #Javascript
解决vant框架做H5时踩过的坑(下拉刷新、上拉加载等)
Nov 11 #Javascript
JS前端基于canvas给图片添加水印
Nov 11 #Javascript
You might like
PHP 存取 MySQL 数据库的一个例子
2006/10/09 PHP
php字符串分割函数用法实例
2015/03/17 PHP
微信公众号之主动给用户发送消息功能
2019/06/22 PHP
网页和浏览器兼容性问题汇总(draft1)
2009/06/01 Javascript
用innerhtml提高页面打开速度的方法
2013/08/02 Javascript
利用JavaScript实现新闻滚动效果(实例代码)
2013/11/27 Javascript
使用jquery写个更改表格行顺序的小功能
2014/04/29 Javascript
使用jquery菜单插件HoverTree仿京东无限级菜单
2014/12/18 Javascript
AngularJS Ajax详解及示例代码
2016/08/17 Javascript
vue系列之动态路由详解【原创】
2017/09/10 Javascript
axios进阶实践之利用最优雅的方式写ajax请求
2017/12/20 Javascript
JavaScript"模拟事件"的注意要点详解
2019/02/13 Javascript
JavaScript监听触摸事件代码实例
2019/12/30 Javascript
vue如何实现动态加载脚本
2020/02/05 Javascript
Python动态加载模块的3种方法
2014/11/22 Python
python 捕获shell脚本的输出结果实例
2017/01/04 Python
python中实现迭代器(iterator)的方法示例
2017/01/19 Python
Python使用openpyxl读写excel文件的方法
2017/06/30 Python
Python自定义线程池实现方法分析
2018/02/07 Python
Python爬虫常用小技巧之设置代理IP
2018/09/13 Python
python try except 捕获所有异常的实例
2018/10/18 Python
浅谈Python3识别判断图片主要颜色并和颜色库进行对比的方法
2019/10/25 Python
pandas处理csv文件的方法步骤
2020/10/16 Python
土木工程应届生自荐信
2013/09/24 职场文书
建筑专业自我鉴定
2013/10/22 职场文书
教育局长自荐信范文
2013/12/22 职场文书
竞选班干部演讲稿100字
2014/08/20 职场文书
购房委托书范本
2014/09/18 职场文书
微笑面对生活演讲稿
2014/09/23 职场文书
2014年学校党建工作总结
2014/11/11 职场文书
为自己工作观后感
2015/06/11 职场文书
消防宣传语大全
2015/07/13 职场文书
红灯733-1型14管5波段半导体收音机
2021/04/22 无线电
python通配符之glob模块的使用详解
2021/04/24 Python
Python办公自动化解决world文件批量转换
2021/09/15 Python
python+pyhyper实现识别图片中的车牌号思路详解
2022/12/24 Python