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 相关文章推荐
静态的动态续篇之来点XML
Aug 15 Javascript
JS 添加千分位与去掉千分位的示例
Jul 11 Javascript
Node.js文件操作详解
Aug 16 Javascript
使用纯javascript实现放大镜效果
Mar 18 Javascript
JavaScript中的Repaint和Reflow用法详解
Jul 27 Javascript
jquery实现全选功能效果的实现代码
May 05 Javascript
vue双向绑定的简单实现
Dec 22 Javascript
Node.js之网络通讯模块实现浅析
Apr 01 Javascript
jQuery实现拖动效果的实例代码
Jun 25 jQuery
vue权限管理系统的实现代码
Jan 17 Javascript
vue-cli3环境变量与分环境打包的方法示例
Feb 18 Javascript
JS基础之逻辑结构与循环操作示例
Jan 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
重置版战役片段
2020/04/09 魔兽争霸
在普通HTTP上安全地传输密码
2007/07/21 PHP
PHP中trim()函数简单使用指南
2015/04/16 PHP
PHP获取当前文件的父目录方法汇总
2016/07/21 PHP
php计算给定日期所在周的开始日期和结束日期示例
2017/02/06 PHP
PHP项目多语言配置平台实现过程解析
2020/05/18 PHP
PHP实现简易图形计算器
2020/08/28 PHP
JavaScript进阶教程(第四课第一部分)
2007/04/05 Javascript
js程序中美元符号$是什么
2008/06/05 Javascript
fancybox1.3.1 基于Jquery的插件在IE中图片显示问题
2010/10/01 Javascript
使用原生js实现页面蒙灰(mask)效果示例代码
2014/06/20 Javascript
在JavaScript中操作时间之getMonth()方法的使用
2015/06/10 Javascript
Javascript字符串常用方法详解
2016/07/21 Javascript
JavaScript的事件机制详解
2017/01/17 Javascript
JS基于面向对象实现的多个倒计时器功能示例
2017/02/28 Javascript
vue自动化表单实例分析
2018/05/06 Javascript
详解微信小程序实现WebSocket心跳重连
2018/07/31 Javascript
在微信小程序里使用watch和computed的方法
2018/08/02 Javascript
node.js爬取中关村的在线电瓶车信息
2018/11/13 Javascript
详解vue-cli 脚手架 安装
2019/04/16 Javascript
js中let能否完全替代IIFE
2019/06/15 Javascript
详解vue中$nextTick和$forceUpdate的用法
2019/12/11 Javascript
Openlayers实现图形绘制
2020/09/28 Javascript
微信小程序对图片进行canvas压缩的方法示例详解
2020/11/12 Javascript
Python列表list操作符实例分析【标准类型操作符、切片、连接字符、列表解析、重复操作等】
2017/07/24 Python
利用python将xml文件解析成html文件的实现方法
2017/12/22 Python
python使用for循环计算0-100的整数的和方法
2019/02/01 Python
Django对models里的objects的使用详解
2019/08/17 Python
美国南加州的原创极限运动潮牌:Vans(范斯)
2016/08/05 全球购物
美国面料纺织品商城:Fabric.com
2017/06/28 全球购物
接受捐赠答谢词
2014/01/27 职场文书
2014教师研修学习体会
2014/07/08 职场文书
工作能力自我评价2015
2015/03/05 职场文书
Nginx设置HTTPS的方法步骤 443证书配置方法
2022/03/21 Servers
微信小程序 WeUI扩展组件库的入门教程
2022/04/21 Javascript
Redis基本数据类型List常用操作命令
2022/06/01 Redis