vue实现表单未编辑或未保存离开弹窗提示功能


Posted in Javascript onApril 08, 2020

说明

UI组件是使用 Quasar Framework 。

最近做一个表单弹出框,表单保存提交,但是,产品提出,用户不保存,而关闭弹出框时,要给出一个弹窗提示。这个功能,可以用watch监听表单数据。当数据表单发生变化,用户点击了关闭按钮,则根据监听结果来判断用户输入或编辑了数据,进而出现弹窗提示,让用户选择是否离开;当数据没发生变化,则不必提示。

确认离开提示框

实现效果

先实现一个确认离开提示框,效果如下:

vue实现表单未编辑或未保存离开弹窗提示功能 

实现代码:

<template>
 <div>
  <q-dialog :persistent="true" v-model="alert">
   <q-card style="width:340px;">
    <q-card-section>
     <q-btn icon="close" flat round dense v-close-popup class="float-right" />
    </q-card-section>

    <q-card-section class="q-pt-none text-center" style="margin-top: 10px;">
     当前数据未保存,是否离开?
    </q-card-section>

    <q-card-actions align="right">
     <q-btn
      flat
      label="是"
      color="primary"
      v-close-popup
      @click="handleConfirm"
     />
     <q-btn flat label="否" v-close-popup />
    </q-card-actions>
   </q-card>
  </q-dialog>
 </div>
</template>

<script>
export default {
 name: 'LeaveTipDialog',
 props: {
 },
 data () {
  return {
   alert: false
  }
 },
 methods: {
  init () {
   this.alert = true
  },
  handleConfirm () {
   // 提交父组件的事件
   this.$emit('handleConfirm')
  }
 }
}
</script>

<style lang="stylus">

</style>

监听代码

监听代码如下:

watch: {
  datas: {
   handler (val) {
    if (val) {
     this.count++
    }
   },
   deep: true
  }
 },

判断数据变化的次数,因为刚加载数据未完全加载的时候,datas是空对象,待加载完之后,则出现一次数据变化, deep主要是深层次监听,因为数据是层层对象,比较复杂

创建/编辑 表单弹出框

代码,表单省略了,大致抽象为:

<template>
 <div>
  <q-dialog :persistent="true" v-model="visible">
   <q-card class="card">
    <q-card-section
     transition-hide="flip-up"
     class="row items-center q-pb-none"
     style="padding-top: 10px;"
    >
     <div class="text-h6">{{ isEdit ? "编辑" : "创建" }}xxxx</div>
     <q-space />
     <q-btn icon="close" flat round dense @click="close" />
    </q-card-section>
    <q-card-section class="form">
     <div class="line"></div>
     <q-form ref="form">
     <!-- 省略了表单行 -->
     </q-form>
    </q-card-section>
   </q-card>
  </q-dialog>
  
    <!-- 弹窗 关闭 编辑/创建时 确认离开-->
  <LeaveTipDialog
   v-if="leave"
   ref="leave"
   @handleConfirm="handleLeave"
  ></LeaveTipDialog>
 </div>
</template>

引入上面写好的确认离开提示框组件:

import LeaveTipDialog from 'components/LeaveTipDialog'
props: {
  isEdit: {
   type: Boolean,
   required: true,
   default: false
  }
 },
 components: {
  LeaveTipDialog
 },
 data () {
  return {
   visible: false,
   form: {
   // .... 具体省略
   },
   count: 0, // form数据修改的数量
   leave: false
  }
 },
 watch: {
  form: {
   handler (val) {
    if (val) {
     this.count++
    }
   },
   deep: true
  }
 },

关闭时判断的代码逻辑:

注意,监听获取到的 count ,分为两种情况:

1、当打开的是新建数据的表单,那么一开始, form 的数据是空内容或者默认值,当用户输入了内容,点击关闭按钮,获取到的 this.count 是1或者更大的值。所以, isEdit 为 fasle 时,判断条件是 !this.isEdit && this.count > 0 时弹出提示,否则不提示直接关闭表单弹出框。

2、当打开的是编辑数据的表单,那么一开始, form 的数据是空内容或者默认值,当打开表单弹框时,先获取了数据详情内容并赋值费表单 form 数据,此时 this.count 的值已经是1了。这时,当用户编辑了表单内容,点击关闭按钮,获取到的 this.count 是大于1的值。所以, isEdit 为 true 时,判断条件是 this.isEdit && this.count > 1 时弹出提示,否则不提示直接关闭表单弹出框。

methods: {
  close () {
   // console.log(`isEdit:${this.isEdit}:${this.count}`)
   if (this.isEdit && this.count > 1) {
    // 编辑 数据有修改弹出提示
    this.leave = true
    this.$nextTick(() => {
     this.$refs.leave.init()
    })
   } else if (!this.isEdit && this.count > 0) {
    // 新建 数据有修改弹出提示
    this.leave = true
    this.$nextTick(() => {
     this.$refs.leave.init()
    })
   } else {
    this.resetForm()
    this.leave = false
    this.visible = false
   }
  },
  handleLeave () {
   this.resetForm()
   this.leave = false
   this.visible = false
  },
  resetForm(){
    // this.form.xxxx = '' // 表单数据清空
    this.count = 0
  }
 }

实现效果

1、新建数据表单弹出框:

1)表单有输入,未保存点击关闭,给出一个弹窗提示“当前数据未保存,是否离开?”,选择是,关闭表单弹出框;选择否,表单弹出框不关闭;

2)表单没有输入任何值,直接点击关闭,直接表单弹出框;

vue实现表单未编辑或未保存离开弹窗提示功能 

2、编辑详情的数据表单弹出框:

1)表单内容有编辑情况,未保存点击关闭,给出一个弹窗提示“当前数据未保存,是否离开?”,选择是,关闭表单弹出框;选择否,表单弹出框不关闭;

2)表单内容没有编辑任何值,直接点击关闭,直接表单弹出框;

vue实现表单未编辑或未保存离开弹窗提示功能 

总结

到此这篇关于vue实现表单未编辑或未保存离开弹窗提示功能的文章就介绍到这了,更多相关vue表单离开弹窗提示内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
JavaScript 模拟用户单击事件
Dec 31 Javascript
jQuery 学习第七课 扩展jQuery的功能 插件开发
May 17 Javascript
js借助ActiveXObject实现创建文件
Sep 29 Javascript
原生JavaScript编写俄罗斯方块
Mar 30 Javascript
JavaScript中的Math.E属性使用详解
Jun 12 Javascript
javascript时间排序算法实现活动秒杀倒计时效果
Jan 28 Javascript
jQuery实现查找链接文字替换属性的方法
Jun 27 Javascript
详解angularJS+Ionic移动端图片上传的解决办法
Sep 13 Javascript
原生js实现抽奖小游戏
Jun 27 Javascript
JavaScript实现的开关灯泡点击切换特效示例
Jul 08 Javascript
express框架中使用jwt实现验证的方法
Aug 25 Javascript
利用 JavaScript 构建命令行应用
Nov 17 Javascript
JS快速实现简单计算器
Apr 08 #Javascript
javascript中contains是否包含功能实现代码(扩展字符、数组、dom)
Apr 07 #Javascript
vue-cli3单页构建大型项目方案
Apr 07 #Javascript
在Chrome DevTools中调试JavaScript的实现
Apr 07 #Javascript
《javascript设计模式》学习笔记四:Javascript面向对象程序设计链式调用实例分析
Apr 07 #Javascript
详解vue中在循环中使用@mouseenter 和 @mouseleave事件闪烁问题解决方法
Apr 07 #Javascript
《javascript设计模式》学习笔记三:Javascript面向对象程序设计单例模式原理与实现方法分析
Apr 07 #Javascript
You might like
PHP经典的给图片加水印程序
2006/12/06 PHP
php防止sql注入代码实例
2013/12/18 PHP
Ubuntu12下编译安装PHP5.3开发环境
2015/03/27 PHP
一波PHP中cURL库的常见用法代码示例
2016/05/06 PHP
PHP CURL post数据报错 failed creating formpost data
2016/10/16 PHP
精选的10款用于构建良好易用性网站的jQuery插件
2011/01/23 Javascript
js中数组排序sort方法的原理分析
2014/11/20 Javascript
简述JavaScript的正则表达式中test()方法的使用
2015/06/16 Javascript
jQuery模拟黑客帝国矩阵效果实例
2015/06/28 Javascript
在AngularJS中使用jQuery的zTree插件的方法
2016/04/21 Javascript
vue项目实现记住密码到cookie功能示例(附源码)
2018/01/31 Javascript
vuejs 动态添加input框的实例讲解
2018/08/24 Javascript
详解js删除数组中的指定元素
2018/10/31 Javascript
微信小程序返回上一页传参并刷新过程解析
2019/12/13 Javascript
JavaScript接口实现方法实例分析
2020/05/16 Javascript
详解阿里Node.js技术文档之process模块学习指南
2021/01/04 Javascript
详解Python之数据序列化(json、pickle、shelve)
2017/03/30 Python
详解用Python练习画个美队盾牌
2019/03/23 Python
浅谈python3中input输入的使用
2019/08/02 Python
Django Admin后台添加数据库视图过程解析
2020/04/01 Python
pycharm安装及如何导入numpy
2020/04/03 Python
python实现扫雷游戏的示例
2020/10/20 Python
CSS3中的元素过渡属性transition示例详解
2016/11/30 HTML / CSS
党员思想汇报范文
2013/12/30 职场文书
《雪儿》教学反思
2014/04/17 职场文书
党员自我剖析材料(群众路线)
2014/10/06 职场文书
费城故事观后感
2015/06/10 职场文书
监守自盗观后感
2015/06/10 职场文书
2015年学校教科室工作总结
2015/07/20 职场文书
学习雷锋主题班会
2015/08/14 职场文书
利用前端HTML+CSS+JS开发简单的TODOLIST功能(记事本)
2021/04/13 Javascript
PHP实现考试倒计时功能代码
2021/04/16 PHP
SONY AN-LP1 短波有源天线放大器
2021/04/22 无线电
Python+Selenium实现读取网易邮箱验证码
2022/03/13 Python
Java中Quartz高可用定时任务快速入门
2022/04/03 Java/Android
Python闭包的定义和使用方法
2022/04/11 Python