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 相关文章推荐
capacityFixed 基于jquery的类似于新浪微博新消息提示的定位框
May 24 Javascript
javascript 基础篇2 数据类型,语句,函数
Mar 14 Javascript
jQuery将所有被选中的checkbox某个属性值连接成字符串的方法
Jan 24 Javascript
jQuery中 attr() 方法使用小结
May 03 Javascript
详解js中构造流程图的核心技术JsPlumb
Dec 08 Javascript
jQuery居中元素scrollleft计算方法示例
Jan 16 Javascript
Angular使用 ng-img-max 调整浏览器中的图片的示例代码
Aug 17 Javascript
搭建vue开发环境
Jul 19 Javascript
JavaScript中的垃圾回收与内存泄漏示例详解
May 02 Javascript
详解在vue-cli3.0中自定css、js和图片的打包路径
Aug 26 Javascript
解决vue 使用axios.all()方法发起多个请求控制台报错的问题
Nov 09 Javascript
Node.js文本文件BOM头的去除方法
Nov 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
用PHP连mysql和oracle数据库性能比较
2006/10/09 PHP
NOD32 v2.70.32 简体中文封装版 提供下载了
2007/02/27 PHP
PHP error_log()将错误信息写入一个文件(定义和用法)
2013/10/25 PHP
Codeigniter校验ip地址的方法
2015/03/21 PHP
thinkPHP框架可添加js事件的分页类customPage.class.php完整实例
2017/03/16 PHP
ThinkPHP框架下微信支付功能总结踩坑笔记
2019/04/10 PHP
JavaScript 高级篇之闭包、模拟类,继承(五)
2012/04/07 Javascript
jquery插件开发注意事项小结
2013/06/04 Javascript
解析jquery获取父窗口的元素
2013/06/26 Javascript
JS实现图片横向滚动效果示例代码
2013/09/04 Javascript
Javascript中的arguments与重载介绍
2015/03/15 Javascript
AngularJS实现表单验证功能
2017/01/09 Javascript
JS实现图片高斯模糊切换效果的焦点图实例
2017/01/21 Javascript
javascript 显示全局变量与隐式全局变量的区别
2017/02/09 Javascript
基于Bootstrap分页的实例讲解(必看篇)
2017/07/04 Javascript
AngularJS中ng-options实现下拉列表的数据绑定方法
2018/08/13 Javascript
JS/HTML5游戏常用算法之路径搜索算法 随机迷宫算法详解【普里姆算法】
2018/12/13 Javascript
微信小程序和百度的语音识别接口详解
2019/05/06 Javascript
json数据格式常见操作示例
2019/06/13 Javascript
Vue.js如何使用Socket.IO的示例代码
2019/09/05 Javascript
js DOM的事件常见操作实例详解
2019/12/16 Javascript
js实现自定义滚动条的示例
2020/10/27 Javascript
python中的decorator的作用详解
2018/07/26 Python
python使用BeautifulSoup与正则表达式爬取时光网不同地区top100电影并对比
2019/04/15 Python
django项目环境搭建及在虚拟机本地创建django项目的教程
2019/08/02 Python
Python FtpLib模块应用操作详解
2019/12/12 Python
解决Python命令行下退格,删除,方向键乱码(亲测有效)
2020/01/16 Python
Python函数式编程实例详解
2020/01/17 Python
html5实现输入框fixed定位在屏幕最底部兼容性
2020/07/03 HTML / CSS
澳洲的服装老品牌:SABA
2018/02/06 全球购物
经管应届生求职信
2013/11/17 职场文书
保密工作实施方案
2014/02/24 职场文书
《风筝》教学反思
2014/04/10 职场文书
邮政营业员岗位职责
2015/04/14 职场文书
2015大学生暑假调查报告
2015/07/13 职场文书
医务人员医德医风心得体会
2016/01/25 职场文书