自学内容网 自学内容网

【el-dialog关闭前重置表单】

el-dialog关闭前重置表单

问题描述

el-dialog的before-close能接收一个回调函数,在对话框关闭前执行需要的动作,例如我需要的是重置对话框中的表单。
如果只有一个对话框,或者说回调函数不需要额外参数,那么对话框可以这么写:

<el-drawer
  :before-close="handleClose"
>
......

handleClose可以这么写:

handleClose(done) {
  this.$confirm('确认关闭吗?').then(_ => {
    this.$refs.formName.resetFields();
    done()
  }).catch(_ => {})
}

但如果有多个对话框共用这一个关闭前的回调函数,就需要指定要重置的表单了。
对话框可以这么写:

<el-drawer
  :before-close="handleClose('formName')"
>
......

handleClose需要写成闭包,闭包中接收对表单参数的处理:

handleClose(formName) {
 console.log(111, formName)
  return (done) => {
    this.$confirm('确认关闭吗?').then(_ => {
       this.$refs[formName].resetFields();
       done()
     }).catch(_ => {
     })
    console.log(222)
    done()
  }
}

区别解释

before-close本身是一个回调函数,它执行完了才会关闭对话框。如果不是函数,那就直接关闭对话框。源码:

closeDrawer() {
 if (typeof this.beforeClose === 'function') {
    this.beforeClose(this.hide);
  } else {
    this.hide();
  }
},
handleClose() {
  // This method here will be called by PopupManger, when the `closeOnPressEscape` was set to true
  // pressing `ESC` will call this method, and also close the drawer.
  // This method also calls `beforeClose` if there was one.
  this.closeDrawer();
}

页面加载时:before-close="xxxx"就会执行,可以通过添加打印发现。
:before-close="handleClose"并没有真的执行handleClose方法,这里只是一个指向,在真的触发对话框close时才会执行,
:before-close="handleClose('formName')"立即执行了handleClose(‘formName’)方法,并将方法的返回值给before-close属性,如果不把handleClose方法改成闭包,那么:before-close="handleClose('formName')"执行后before-close就变成了一个确切的值而不是一个函数,那么对话框在触发关闭时会直接关闭,就没有什么关闭前的操作了。
而写成闭包就不一样了。按照闭包的写法,handleClose('formName')的返回值是一个函数,也就是说before-close属性是一个函数 ,即handleClose中return的以done为参数的函数。再结合源码 if (typeof this.beforeClose === 'function') {this.beforeClose(this.hide);},触发关闭时,会先执行这个函数,函数执行完再执行this.hide()


原文地址:https://blog.csdn.net/weixin_43846196/article/details/144372823

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!