Vue2.x使用Element组件登录过期多次弹窗问题

Vue2.x使用Element组件登录过期多次弹窗问题

一、问题

  • Vue2.x版本使用Element组件库中message消息提示组件时会出现当前用户登录失效时,接口返回非成功的code,在响应拦截中进行抛错处理导致出现多次弹窗的问题,如下所示:
    在这里插入图片描述

  • 出现的原因,后端进行身份过期的判断,当过期时请求接口参数code为非200,前端响应拦截时做了统一错误抛出处理,代码如下:

    import ElementUI from 'element-ui'
    Vue.use(ElementUI)
    ...
    // 响应拦截
    axios.interceptors.response.use(res => {
      if (res.data.code && res.data.code != 200) {
        if (res.data.code == 1500 || res.data.code == 401) {
          sessionStorage.clear()
          router.push({
            path: "/login"
          })
        }
        ElementUI.Message({
          type: "error",
          message: res.data.msg
        })
      }
      return res
    })
    

二、解决

  • 解决方法分为两种:

  • 第一种(推荐):设置一个状态参数status,用于拦截当前code为非200的响应数据,以此解决多次弹窗的问题,代码如下:

    import ElementUI from 'element-ui'
    Vue.use(ElementUI)
    ...
    // 响应拦截
    // 用于拦截code!=200的响应数据
    let status = true;
    axios.interceptors.response.use(res => {
      if (res.data.code && res.data.code != 200 && status) {
        if (res.data.code == 1500 || res.data.code == 401) {
          sessionStorage.clear()
          router.push({
            path: "/login"
          })
        }
        status = false;
        ElementUI.Message({
          type: "error",
          message: res.data.msg
        })
        let timeout = setTimeout(() => {
          status = true;
          clearTimeout(timeout);
        }, 1500)
      }
      return res
    })
    
  • 第二种(不推荐):重写组件message的方法进行优化,这里可以新建一个工具函数utils.js,里面写重置组件message的方法,之后在main.js中进行引入使用即可,这里需要注意,挂载自定义组件message必须放在Vue.use(ElementUI)的后面,才可以覆盖Element组件默认的message,代码如下:

    // utils.js代码
    import {
        Message
    } from 'element-ui';
    let messageInstance = null;
    const resetMessage = (options) => {
        if(messageInstance) {
            messageInstance.close()
        }
        messageInstance = Message(options)
    };
    ['error','success','info','warning'].forEach(type => {
        resetMessage[type] = options => {
            if(typeof options === 'string') {
                options = {
                    message:options
                }
            }
            options.type = type
            return resetMessage(options)
        }
    })
    export const message = resetMessage
    
    
    // main.js代码
    Vue.use(ElementUI)
    import { message } from '../utils.js'
    Vue.prototype.$message = message
    ...
    // 响应拦截
    axios.interceptors.response.use(res => {
      if (res.data.code && res.data.code != 200) {
        if (res.data.code == 1500 || res.data.code == 401) {
          sessionStorage.clear()
          router.push({
            path: "/login"
          })
        }
        message({
          type: "error",
          message: res.data.msg
        })
      }
      return res
    })
    

到此问题就都解决了,如果有更好的解决方法欢迎补充讨论!🌈

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Vue 2.x中使用Element UI来导入和导出Excel,你需要安装element-ui和file-saver插件。 首先,在Vue项目中使用npm或yarn安装Element UI和file-saver插件: ``` npm install element-ui file-saver --save ``` 然后,在Vue组件中引入所需的文件: ```javascript import { Button, Table } from 'element-ui' import XLSX from 'xlsx' import FileSaver from 'file-saver' ``` 在组件中,你需要定义导入和导出Excel的方法。下面是一个简单的示例: ```javascript methods: { // 导入Excel handleImportExcel(file) { const reader = new FileReader() reader.onload = (e) => { const data = new Uint8Array(e.target.result) const workbook = XLSX.read(data, { type: 'array' }) const worksheet = workbook.Sheets[workbook.SheetNames[0]] const jsonData = XLSX.utils.sheet_to_json(worksheet, { header: 1 }) // 处理导入的Excel数据 console.log(jsonData) } reader.readAsArrayBuffer(file.raw) }, // 导出Excel handleExportExcel() { const jsonData = [ ['姓名', '年龄', '性别'], ['张三', 18, '男'], ['李四', 20, '女'] ] const worksheet = XLSX.utils.aoa_to_sheet(jsonData) const workbook = XLSX.utils.book_new() XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1') const excelBuffer = XLSX.write(workbook, { bookType: 'xlsx', type: 'array' }) const excelData = new Blob([excelBuffer], { type: 'application/octet-stream' }) FileSaver.saveAs(excelData, 'example.xlsx') } } ``` 最后,在模板中使用Element UI的Button和Table组件,分别绑定导入和导出Excel的方法: ```html <template> <div> <el-button type="primary" @change="handleImportExcel">导入Excel</el-button> <el-table :data="tableData"> <!-- 表格内容 --> </el-table> <el-button type="success" @click="handleExportExcel">导出Excel</el-button> </div> </template> ``` 这样,你就可以在Vue项目中使用Element UI来导入和导出Excel了。当用户选择一个Excel文件时,`handleImportExcel`方法将会被触发,并将Excel数据转换为JSON数据进行处理。而`handleExportExcel`方法则会将JSON数据转换为Excel文件并进行下载。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值