当前位置: 首页 > news >正文

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

说明

UI组件是使用 Quasar Framework 。

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

确认离开提示框

实现效果

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

实现代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

<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>

监听代码

监听代码如下:

1

2

3

4

5

6

7

8

9

10

watch: {

  datas: {

   handler (val) {

    if (val) {

     this.count++

    }

   },

   deep: true

  }

 },

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

创建/编辑 表单弹出框

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

<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>

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

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 时弹出提示,否则不提示直接关闭表单弹出框。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

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)表单没有输入任何值,直接点击关闭,直接表单弹出框;

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

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

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

总结

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

相关文章:

  • vue中父组件异步获取数据给子组件传参
  • 如何打造一个属于自己的命令行工具
  • git bash使用vue-cli创建项目无法切换选项
  • 线程和进程的区别是什么?
  • vue中的mixins(混入)使用场景介绍
  • webpack中,devServer.proxy跨域无效的解决办法
  • 数组里的字符串转换成数字或者把数字转换成字符串
  • 小米运动蓝牙耳机使用说明书-如果第二次切换到配对状态
  • el-input只能输入数字
  • element多个弹窗层级问题
  • 浅谈测试左移和测试右移
  • js去除字符串中的所有空格(包括前后,中间存在的所有空格)
  • js判断数组是否有重复值
  • 0-100
  • CSS文本超过两行用省略号代替(兼容所有浏览器)
  • emacs初体验
  • go语言学习初探(一)
  • Invalidate和postInvalidate的区别
  • Java 23种设计模式 之单例模式 7种实现方式
  • JavaScript HTML DOM
  • node和express搭建代理服务器(源码)
  • PHP 7 修改了什么呢 -- 2
  • Spring Boot MyBatis配置多种数据库
  • Vue2.0 实现互斥
  • 百度地图API标注+时间轴组件
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 原生Ajax
  • 终端用户监控:真实用户监控还是模拟监控?
  • 函数计算新功能-----支持C#函数
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (python)数据结构---字典
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (转)Mysql的优化设置
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • .mysql secret在哪_MySQL如何使用索引
  • .net Signalr 使用笔记
  • .NET(C#、VB)APP开发——Smobiler平台控件介绍:Bluetooth组件
  • .NET的数据绑定
  • .NET关于 跳过SSL中遇到的问题
  • .NET简谈设计模式之(单件模式)
  • .NET开发不可不知、不可不用的辅助类(三)(报表导出---终结版)
  • .php结尾的域名,【php】php正则截取url中域名后的内容
  • /bin/rm: 参数列表过长"的解决办法
  • @Autowired自动装配
  • @column注解_MyBatis注解开发 -MyBatis(15)
  • @Controller和@RestController的区别?
  • []sim300 GPRS数据收发程序
  • []使用 Tortoise SVN 创建 Externals 外部引用目录
  • [2018/11/18] Java数据结构(2) 简单排序 冒泡排序 选择排序 插入排序
  • [bzoj1912]异象石(set)
  • [COI2007] Sabor