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

说明

UI组件是使用 Quasar Framework

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

确认离开提示框

实现效果

先实现一个确认离开提示框,效果如下:
vue实现表单未编辑或未保存离开弹窗提示_第1张图片

实现代码:







监听代码

监听代码如下:

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

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

创建/编辑 表单弹出框

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


    

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

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或者更大的值。所以,isEditfasle时,判断条件是!this.isEdit && this.count > 0时弹出提示,否则不提示直接关闭表单弹出框。

2、当打开的是编辑数据的表单,那么一开始,form的数据是空内容或者默认值,当打开表单弹框时,先获取了数据详情内容并赋值费表单form数据,此时this.count的值已经是1了。这时,当用户编辑了表单内容,点击关闭按钮,获取到的this.count是大于1的值。所以,isEdittrue 时,判断条件是 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张图片

2、编辑详情的数据表单弹出框:
1)表单内容有编辑情况,未保存点击关闭,给出一个弹窗提示“当前数据未保存,是否离开?”,选择是,关闭表单弹出框;选择否,表单弹出框不关闭;
2)表单内容没有编辑任何值,直接点击关闭,直接表单弹出框;
vue实现表单未编辑或未保存离开弹窗提示_第3张图片

参考资料

vue实现判断页面是否编辑及编辑页面未保存离开弹窗提示

你可能感兴趣的:(前端,vue.js,quasar)