vue—MessageBox全局弹窗倒计时展示

文章介绍了如何在前端使用响应拦截器结合Element-UI处理后端返回的特定code,展示弹窗。当code满足条件时,弹窗显示警告信息,如果需要倒计时,使用setInterval实现动态更新,并确保弹窗只显示一次。此外,文章还展示了在Vuex仓库中管理状态以防止多次弹窗的方法。


前言

当需要进行全局弹窗倒计时展示时。后端需要的就是在特定的要求时,每个接口都能返回特定的code。而前端需要完成的工作是:
1.在响应拦截器里拦截每个接口code,判断是否进行弹窗显示。
2.如果要倒计时,进行倒计时展示效果。
3.如果同时调用许多接口,保证弹窗只弹出一次。


一、在响应拦截器里进行弹窗展示

1.引入element-ui

这一步是在接口的拦截器里进行的,一步命名为request.js或者axios.js文件中
代码如下(示例):

import { MessageBox } from 'element-ui'

2.判断code并进行弹窗展示

这一步是在响应拦截器里

if (res.code == 436) {
     MessageBox.alert(
       '您好,系统检测到您所属的账号存在异常,详询********。',
       '异常提示',
       {
         confirmButtonText: '知道了',
         dangerouslyUseHTMLString: true,
         closeOnClickModal: false,
         callback: action => {
  			console.log("这里我是跳转到首页,并调用退出登录的接口");
        }
      }
    )
 }

二、如果有倒计时功能

这里我是用setInterval实现倒计时功能,用原生写法动态渲染到弹窗上

代码如下(示例):

if (res.code == 430) {
  let time = 30;
  let timer;
  timer = setInterval(() => {
    time--;
    document.getElementById('timed').innerHTML = time;//实现动态渲染
    if (time == 0) {
      clearInterval(timer);//如果到0清除倒计时
      console.log("这里我是跳转到首页,并调用退出登录的接口");
      document.getElementById('timed').innerHTML = 30;//重新赋为30秒
      MessageBox.close(false);//关闭弹窗
    }
  }, 1000);//进行倒计时
  MessageBox.alert(
    `<div>您的角色权限发生变化,若有疑问,请联系系统管理员;系统将在<span id='timed' style='color: #06B7AE'>30</span>s后退出,重新登录后方可正常使用。</div>`,
    '角色权限变更提醒',
    {
      confirmButtonText: '重新登录',
      dangerouslyUseHTMLString: true,
      closeOnClickModal: false,
      callback: action => {
        clearInterval(timer);//如果点击清除倒计时
        console.log("这里我是跳转到首页,并调用退出登录的接口");
        document.getElementById('timed').innerHTML = 30;//重新赋为30秒
      }
    }
  )
}

三、保证弹窗只弹出一次

在仓库里面存储一个值,默认为true,第一次调用接口出现该code时就把值改成false。然后在弹窗哪里判断该值为true还是false

代码如下(示例):

if (res.code == 430) {
   let time = 30;
   let timer;
   timer = setInterval(() => {
     time--;
     document.getElementById('timed').innerHTML = time;//实现动态渲染
     if (time == 0) {
       clearInterval(timer);//如果到0清除倒计时
       console.log("这里我是跳转到首页,并调用退出登录的接口");
       MessageBox.close(false);//关闭弹窗
       document.getElementById('timed').innerHTML = 30;//重新赋为30秒
     }
   }, 1000);
   if (store.getters.numbve) { //判断仓库里的值如果为true那么证明是第一次调用,就弹出弹窗
     store.dispatch('user/changenumbve', false);//仓库里的值赋为false
     MessageBox.alert(
       `<div>您的角色权限发生变化,若有疑问,请联系系统管理员;系统将在<span id='timed' style='color: #06B7AE'>30</span>s后退出,重新登录后方可正常使用。</div>`,
       '角色权限变更提醒',
       {
         confirmButtonText: '重新登录',
         dangerouslyUseHTMLString: true,
         closeOnClickModal: false,
         callback: action => {
           clearInterval(timer);//如果点击清除倒计时
           console.log("这里我是跳转到首页,并调用退出登录的接口");
           document.getElementById('timed').innerHTML = 30;//重新赋为30秒
         }
       }
     )
   } else {
     clearInterval(timer);
   }
 }

效果图如下:
在这里插入图片描述

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值