Skip to content

Modal 嵌入 Form 表单验证之防止关闭

需求

在 Modal 弹窗中嵌入一个 Form 表单用来做信息收集,要求表单必选项填写完全才可关闭

我们正常写法,点击确认弹窗就会自动关闭。

实现方法

Modal 弹窗组件中有一个 loading 属性,可以控制弹窗是否关闭,并把确认按钮开启 loading 状态

确认方法中直接设置 loading 无法直接生效,需要搭配 Vue.$nextTick() 来使用

代码实现

vue
<template>
  <Button type="primary" @click="modal = true">点击打开实例</Button>
  <Modal v-model="modal" title="Title" :loading="loading" @on-ok="asyncOK">
    <Form
      ref="formValidate"
      :model="formValidate"
      :rules="ruleValidate"
      :show-message="false"
      :label-width="80"
    >
      <FormItem label="Name" prop="name">
        <Input v-model="formValidate.name" placeholder="请填写姓名"></Input>
      </FormItem>
      <FormItem label="E-mail" prop="mail">
        <Input v-model="formValidate.mail" placeholder="请填写邮箱"></Input>
      </FormItem>
    </Form>
  </Modal>
</template>
<script>
export default {
  data() {
    return {
      modal: false,
      loading: true,
      formValidate: {},
      ruleValidate: {
        name: [{ required: true, trigger: 'blur' }],
        mail: [
          { required: true, trigger: 'blur' },
          { type: 'email', trigger: 'blur' }
        ]
      }
    }
  },
  methods: {
    asyncOK() {
      this.$refs['formValidate'].validate(valid => {
        if (valid) {
          this.$Message.success('成功!')
          this.modal = false
        } else {
          this.$Message.error('请填写必选项!')
          this.loading = false // 关闭 loading
          this.$nextTick(() => {
            this.loading = true // 下次渲染前打开 loading
          })
        }
      })
    }
  }
}
</script>

Released under the MIT License.