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判断是否为数字,是否为整数,是否为浮点数的代码
Apr 24 Javascript
JS继承--原型链继承和类式继承
Apr 08 Javascript
jquery sortable的拖动方法示例详解
Jan 16 Javascript
javascript生成json数据简单示例分享
Feb 14 Javascript
js如何判断用户是否是用微信浏览器
Jun 05 Javascript
使用原生js实现页面蒙灰(mask)效果示例代码
Jun 20 Javascript
javascript实现获取字符串hash值
May 10 Javascript
详解JavaScript的Date对象(制作简易钟表)
Apr 07 Javascript
详解vue的数据binding绑定原理
Apr 12 Javascript
在小程序开发中使用npm的方法
Oct 17 Javascript
electron实现静默打印的示例代码
Aug 12 Javascript
VUE兄弟组件传值操作实例分析
Oct 26 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 curl_setopt()函数实例代码与参数分析
2011/06/02 PHP
php增删改查示例自己写的demo
2013/09/04 PHP
PHP同时连接多个mysql数据库示例代码
2014/03/17 PHP
php简单操作mysql数据库的类
2015/04/16 PHP
详解Grunt插件之LiveReload实现页面自动刷新(两种方案)
2015/07/31 PHP
PHP爬虫之百万级别知乎用户数据爬取与分析
2016/01/22 PHP
php实现基于pdo的事务处理方法示例
2017/07/21 PHP
PHP封装的XML简单操作类完整实例
2017/11/13 PHP
Laravel自动生成UUID,从建表到使用详解
2019/10/24 PHP
[对联广告] JS脚本类
2006/08/27 Javascript
用JS判别浏览器种类以及IE版本的几种方法小结
2011/08/02 Javascript
JavaScript 匿名函数(anonymous function)与闭包(closure)
2011/10/04 Javascript
jquery复选框checkbox实现删除前判断
2014/04/20 Javascript
使用jQuery监听DOM元素大小变化
2016/02/24 Javascript
jQuery UI结合Ajax创建可定制的Web界面
2016/06/22 Javascript
JS动态给对象添加属性和值的实现方法
2016/10/21 Javascript
vue.js实现表格合并示例代码
2016/11/30 Javascript
JavaScript 用fetch 实现异步下载文件功能
2017/07/21 Javascript
JS实现textarea通过换行或者回车把多行数字分割成数组并且去掉数组中空的值
2018/10/29 Javascript
轻松解决JavaScript定时器越走越快的问题
2019/05/13 Javascript
用Python和MD5实现网站挂马检测程序
2014/03/13 Python
python格式化字符串实例总结
2014/09/28 Python
python实现简单的TCP代理服务器
2014/10/08 Python
Django中信号signals的简单使用方法
2019/07/04 Python
pycharm配置git(图文教程)
2019/08/16 Python
Python使用微信itchat接口实现查看自己微信的信息功能详解
2019/08/22 Python
Django项目后台不挂断运行的方法
2019/08/31 Python
浅谈html5 响应式布局
2014/12/24 HTML / CSS
HTML5实现音频和视频嵌入的方法
2018/08/22 HTML / CSS
师范生教师实习自我鉴定
2013/09/27 职场文书
经济与贸易专业应届生求职信
2013/11/19 职场文书
食品行业求职人的自我评价
2014/01/19 职场文书
小学生自我评价范文
2014/01/25 职场文书
校园主题婚礼活动策划方案
2014/09/15 职场文书
2014优秀大学生简历自我评价
2014/09/15 职场文书
Go 语言中 20 个占位符的整理
2021/10/16 Golang