首页 > 其他分享 >Vue.js + iView 中防止模态框提前关闭的解决方案

Vue.js + iView 中防止模态框提前关闭的解决方案

时间:2024-12-11 18:56:11浏览次数:7  
标签:模态 Vue false formData js 关闭 按钮 iView

Vue.js + iView 中防止模态框提前关闭的解决方案

问题描述

在使用 iView 的 Modal 组件实现密码修改功能时,我遇到了一个常见问题:点击确定按钮后,无论 API 调用是否成功,模态框都会自动关闭。这导致了糟糕的用户体验,因为用户在密码修改失败时无法看到错误信息。

问题原因

iView 的 Modal 组件默认行为是在点击确定按钮时自动关闭。这是因为:

  1. Modal 的 @on-ok 事件在点击确定时立即触发
  2. 模态框在等待异步操作完成之前就关闭了
  3. 错误信息在模态框已经关闭后才显示

解决方案

以下是我们的优化实现方案:

1. 自定义底部按钮

不使用 Modal 的默认确定和取消按钮,而是创建自定义的底部按钮:

<Modal
  v-model="changePwdModal"
  title="修改密码"
  :loading="isChangepwdLoading"
  :closable="!isChangepwdLoading"
  :mask-closable="false"
>
  <!-- 表单内容 -->
  <div slot="footer">
    <Button type="text" @click="handleCancel">取消</Button>
    <Button type="primary" :loading="isChangepwdLoading" @click="handleChangePwd">确定</Button>
  </div>
</Modal>

2. 加载状态控制

添加加载状态以防止重复提交和意外关闭:

data () {
  return {
    isChangepwdLoading: false,
    changePwdModal: false,
    formData: {
      oldPassword: '',
      newPassword: '',
      confirmPassword: ''
    }
  }
}

3. 异步处理优化

实现正确的异步处理和错误捕获:

async handleChangePwd () {
  this.$refs.changePwdForm.validate(async (valid) => {
    if (valid) {
      this.isChangepwdLoading = true
      try {
        const res = await changePassword({
          password: this.formData.oldPassword,
          newPassword: this.formData.newPassword,
          confirmPassword: this.formData.confirmPassword
        })
        
        if (res.data.code === 200) {
          this.$Message.success('密码修改成功')
          this.formData = {
            oldPassword: '',
            newPassword: '',
            confirmPassword: ''
          }
          this.changePwdModal = false
        } else {
          this.$Message.error(res.data.message)
        }
      } catch (error) {
        this.$Message.error('密码修改失败:' + error)
      } finally {
        this.isChangepwdLoading = false
      }
    }
  })
}

4. 取消处理

实现清晰的取消处理逻辑:

handleCancel () {
  this.changePwdModal = false
  this.formData = {
    oldPassword: '',
    newPassword: '',
    confirmPassword: ''
  }
}

5. 防止意外关闭

添加多重保护以防止模态框意外关闭:

<Modal
  :closable="!isChangepwdLoading"
  :mask-closable="false"
  <!-- 其他属性 -->
>
  • :closable="!isChangepwdLoading" - 在加载时禁用关闭按钮
  • :mask-closable="false" - 防止点击背景时关闭

主要优势

这个实现方案带来了以下好处:

  1. 更好的用户体验:失败时模态框保持打开状态,用户可以清楚地看到错误信息
  2. 加载状态反馈:提交按钮显示加载状态,提供视觉反馈
  3. 防止重复提交:加载状态可以防止多次提交
  4. 表单重置控制:只在提交成功或手动取消时才清空表单
  5. 可控的关闭行为:模态框只在成功或明确取消时关闭

总结

在 Vue.js 和 iView 中处理模态框时,特别是涉及异步操作时,控制好关闭行为非常重要。通过实现:

  • 自定义底部按钮
  • 合理的加载状态
  • 正确的异步处理
  • 防止意外关闭
  • 适时的表单重置
  • 清晰的用户反馈

我们可以创建一个更加健壮和用户友好的交互体验。这些实践可以帮助你在 Vue.js 应用中创建更好的模态框交互效果。

标签:模态,Vue,false,formData,js,关闭,按钮,iView
From: https://www.cnblogs.com/xieweikang/p/18600495

相关文章

  • JS 垃圾回收与闭包
    垃圾回收标记清除当变量进入环境时,将其标记为“进入环境”。当变量离开环境时,则将其标记为“离开环境”。垃圾回收器会销毁那些带标记的值,并回收它们所占用的内存空间。functiontest(){vara=1;//函数调用时被标记进入上下文}test();//函数执行完毕,a的标记去掉,......
  • vue el-select封装一个滚动加载更多下拉选项的自定义指令
    没有什么讲究,直接上代码模板部分<el-selectv-model="operator"filterableremotesize="small"reserve-keywordplaceholder="请输入经办人姓名":......
  • 10位时间戳、13位时间戳以及17位时间戳在JS中的格式转换
    目录目录目录一、介绍1、10位时间戳2、13位时间戳3、17位时间戳二、13位时间戳的转换1、获取当前时间的13位时间戳2、转换成标准日期3、转换成格式化日期三、10位时间戳的转换1、获取当前时间的10位时间戳2、转换成标准日期3、转换成格式化日期四、17位时间戳的转换一、介绍1、......
  • FineReport其他js记录
    1.js修改日期组件背景色边框setTimeout(function(){​varcolor="#092347";​varfontColor="white";​//日期控件​$$(".report-main-parameter-container-controller-datetime").css({"background":color});//设置背景$$(".report-main-par......
  • js逆向-2-跟栈
    wy云js加密逆向登录的时候会加密我们输入的电话号码,我们需要得到这个Params的加密方法首先点击登录之后抓取数据包,点击第一个,并打上断点然后点击发送验证码就会断住这里的arguments里面就有我们想要的值,然后继续跟栈这里显示a的值通过o[0]获取的,然后继续跟进栈显示a=i[......
  • 利用husky.js git hooks实现图片自动压缩功能
    场景在一般的网页开发过程中,往往我们都要下载较多的切图,而这些切图未必都做了压缩,即使做了压缩,效果未必能达到理想效果。要解决这种图片压缩问题,途径有很多1.手动将图片丢到xx站点,压缩好之后再放进项目2.让UI给已经压缩好的图这些方式都得靠人工操作,人工操作往往存在一些不......
  • nodejs长字符串RSA加解密解决方法
            为了让项目数据在前后端交互过程中不被拦截破解,在项目中使用RSA对数据进行加解密,同时考虑到交互数据过大情况,于是想到将数据在加密前先进行压缩,解密后在解压的思路。        基于nodejs代码进行测试,得到了验证。constNodeRSA=require('node-rsa')......
  • 【2024最新】基于Springboot+Vue的休闲娱乐代理售票系统Lw+PPT
    作者:计算机搬砖家开发技术:SpringBoot、php、Python、小程序、SSM、Vue、MySQL、JSP、ElementUI等,“文末源码”。专栏推荐:SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码精品专栏:Java精选实战项目源码、Python精选实战项目源码、大数据精选实战项目源码......
  • 【2024最新】基于Springboot+Vue的学生就业管理系统Lw+PPT
    作者:计算机搬砖家开发技术:SpringBoot、php、Python、小程序、SSM、Vue、MySQL、JSP、ElementUI等,“文末源码”。专栏推荐:SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码精品专栏:Java精选实战项目源码、Python精选实战项目源码、大数据精选实战项目源码......
  • A5433 Java+Jsp+Servlet+MySQL+微信小程序+LW+在线点餐小程序的设计与实现 源码 配置
    在线点餐小程序的设计与实现1.摘要2.开发目的和意义2.1系统开发目的2.2系统开发意义3.系统功能设计4.系统界面截图5.源码获取1.摘要摘要近几年,人们生活水平日益提升,但工作强度和压力不断增强,尤其是对于上班族而言,到餐厅吃饭费时费力,而传统的APP点餐难以适应针对......