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 相关文章推荐
js 获取input点选按钮的值的方法
Apr 14 Javascript
ECMAScript 6即将带给我们新的数组操作方法前瞻
Jan 06 Javascript
js获取时间函数及扩展函数的方法
Oct 30 Javascript
JS实现购物车特效
Feb 02 Javascript
js, jQuery实现全选、反选功能
Mar 08 Javascript
Angular中$broadcast和$emit的使用方法详解
May 22 Javascript
基于Vue中点击组件外关闭组件的实现方法
Mar 06 Javascript
详解vue中点击空白处隐藏div的实现(用指令实现)
Apr 19 Javascript
video.js 实现视频只能后退不能快进的思路详解
Aug 09 Javascript
vue如何截取字符串
May 06 Javascript
Vue(定时器)解决mounted不能获取到data中的数据问题
Jul 30 Javascript
JavaScript实现简易计算器小功能
Oct 22 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
fckeditor上传文件按日期存放及重命名方法
2015/05/22 PHP
PHP unlink与rmdir删除目录及目录下所有文件实例代码
2018/02/07 PHP
js类后台管理菜单类-MenuSwitch
2007/09/12 Javascript
javascript中检测变量的类型的代码
2010/12/28 Javascript
js不能跳转到上一页面的问题解决方法
2013/03/01 Javascript
js实现缓冲运动效果的方法
2015/04/10 Javascript
KVM虚拟化技术之使用Qemu-kvm创建和管理虚拟机的方法
2016/10/05 Javascript
vue组件实例解析
2017/01/10 Javascript
详解vue 实例方法和数据
2017/10/23 Javascript
JS设计模式之策略模式概念与用法分析
2018/02/05 Javascript
JS中使用react-tooltip插件实现鼠标悬浮显示框
2019/05/15 Javascript
浅谈监听单选框radio改变事件(和layui中单选按钮改变事件)
2019/09/10 Javascript
vue引用外部JS的两种种方法
2020/01/28 Javascript
JavaScript 常见的继承方式汇总
2020/09/17 Javascript
[59:26]DOTA2上海特级锦标赛D组资格赛#1 EG VS VP第二局
2016/02/28 DOTA
[02:42]决战东方!DOTA2亚洲邀请赛重启荣耀之争
2017/03/17 DOTA
Python获取文件ssdeep值的方法
2014/10/05 Python
python开启多个子进程并行运行的方法
2015/04/18 Python
详解Python3中yield生成器的用法
2015/08/20 Python
Python3单行定义多个变量或赋值方法
2018/07/12 Python
使用Python发现隐藏的wifi
2020/03/04 Python
python json.dumps() json.dump()的区别详解
2020/07/14 Python
Jupyter notebook命令和编辑模式常用快捷键汇总
2020/11/17 Python
加拿大便宜的隐形眼镜商店:Clearly
2016/09/15 全球购物
新西兰便宜隐形眼镜购买网站:QUICKLENS New Zealand
2019/03/02 全球购物
纬创Java面试题笔试题
2014/10/02 面试题
什么是方法的重载
2013/06/24 面试题
银行职业规划书范文
2013/12/28 职场文书
写给女生的道歉信
2014/01/08 职场文书
高中教师评语大全
2014/04/25 职场文书
化工工艺设计求职信
2014/06/25 职场文书
2014年保密工作总结
2014/11/22 职场文书
2015医院个人工作总结范文
2015/05/21 职场文书
关于Numpy之repeat、tile的用法总结
2021/06/02 Python
利用Java设置Word文本框中的文字旋转方向的实现方法
2021/06/28 Java/Android
DE1107机评
2022/04/05 无线电