Element UI中的表单校验与异步验证问题

时尚捕手 2019-04-07 ⋅ 32 阅读

在Web开发中,表单校验是非常重要的一个环节。在Element UI库中,我们可以方便地使用内置的校验规则来实现表单的校验功能。然而,当涉及到异步验证时,可能会遇到一些问题。本篇博客将讨论Element UI中的表单校验与异步验证问题,并提供解决方案。

表单校验基础

在Element UI中,我们可以通过在表单项的rules属性中定义校验规则来实现表单的校验功能。校验规则是一个数组,每个规则对象包含validatortrigger两个属性。

其中,validator是一个函数,用于实现具体的校验逻辑。该函数接收三个参数:表单项的值、校验回调函数、与当前规则关联的表单项组件实例。

trigger属性定义了校验触发的时机,默认为blur,即在表单项失去焦点时触发校验。其他可选的值有change(在值改变时触发校验)和submit(在表单提交时触发校验)。

以下是一个示例:

<template>
  <el-form ref="form" :model="formData" :rules="formRules">
    <el-form-item label="用户名" prop="username">
      <el-input v-model="formData.username"></el-input>
    </el-form-item>
    <el-form-item label="密码" prop="password">
      <el-input v-model="formData.password" type="password"></el-input>
    </el-form-item>
    <el-form-item>
      <el-button type="primary" @click="submitForm">提交</el-button>
    </el-form-item>
  </el-form>
</template>

<script>
export default {
  data() {
    return {
      formData: {
        username: '',
        password: ''
      },
      formRules: {
        username: [
          { required: true, message: '请输入用户名', trigger: 'blur' }
        ],
        password: [
          { required: true, message: '请输入密码', trigger: 'blur' }
        ]
      }
    }
  },
  methods: {
    submitForm() {
      this.$refs.form.validate(valid => {
        if (valid) {
          // 表单校验通过,执行提交逻辑
        } else {
          // 表单校验不通过
        }
      })
    }
  }
}
</script>

异步校验问题

在某些情况下,我们需要进行异步校验,例如:校验用户名是否已存在、校验手机号码是否已注册等。Element UI并没有提供直接的异步校验解决方案,但我们可以通过自定义校验规则的方式来实现。

在校验规则的validator函数中,我们可以返回一个Promise实例,并在Promise的回调函数中通过调用校验回调函数来实现异步校验的结果返回。

下面是一个示例,演示了如何使用异步校验规则校验手机号码是否已注册:

<template>
  <el-form ref="form" :model="formData" :rules="formRules">
    <el-form-item label="手机号" prop="mobile">
      <el-input v-model="formData.mobile"></el-input>
    </el-form-item>
    <el-form-item>
      <el-button type="primary" @click="submitForm">提交</el-button>
    </el-form-item>
  </el-form>
</template>

<script>
export default {
  data() {
    return {
      formData: {
        mobile: ''
      },
      formRules: {
        mobile: [
          { required: true, message: '请输入手机号码', trigger: 'blur' },
          { pattern: /^1[3456789]\d{9}$/, message: '手机号码格式不正确', trigger: 'blur' },
          { validator: this.checkMobileExists, trigger: 'blur' }
        ]
      }
    }
  },
  methods: {
    submitForm() {
      this.$refs.form.validate(valid => {
        if (valid) {
          // 表单校验通过,执行提交逻辑
        } else {
          // 表单校验不通过
        }
      })
    },
    checkMobileExists(rule, value, callback) {
      // 模拟异步请求过程
      setTimeout(() => {
        if (value === '135****1234') {
          callback(new Error('该手机号码已注册'))
        } else {
          callback()
        }
      }, 1000)
    }
  }
}
</script>

在上述示例中,我们通过checkMobileExists函数来模拟校验手机号码是否已注册的异步过程。如果手机号码已注册,则通过调用校验回调函数并传递一个错误对象来返回校验结果,否则直接调用校验回调函数来返回校验通过的结果。

表单校验的显示与隐藏

当我们使用了异步校验规则时,可能会出现一种情况:异步校验请求已发出,但是请求结果尚未返回,此时校验错误信息可能会显示在表单项旁边的错误提示框中。这可能会给用户带来困惑,因为他们可能认为输入是不合法的,而实际上只是异步校验请求正在进行中。

为了解决这个问题,我们可以在异步校验规则中使用noop属性来延迟显示错误信息。当校验规则中的noop属性为true时,错误信息不会立即显示,而是等到校验结果返回后再显示。

下面是一个示例,演示了如何使用noop属性延迟显示错误信息:

<template>
  <el-form ref="form" :model="formData" :rules="formRules">
    <el-form-item label="用户名" prop="username">
      <el-input v-model="formData.username"></el-input>
    </el-form-item>
    <el-form-item>
      <el-button type="primary" @click="submitForm">提交</el-button>
    </el-form-item>
  </el-form>
</template>

<script>
export default {
  data() {
    return {
      formData: {
        username: ''
      },
      formRules: {
        username: [
          { required: true, message: '请输入用户名', trigger: 'blur' },
          { validator: this.checkUsernameExists, noop: true }
        ]
      }
    }
  },
  methods: {
    submitForm() {
      this.$refs.form.validate(valid => {
        if (valid) {
          // 表单校验通过,执行提交逻辑
        } else {
          // 表单校验不通过
        }
      })
    },
    checkUsernameExists(rule, value, callback) {
      // 模拟异步请求过程
      setTimeout(() => {
        if (value === 'admin') {
          callback(new Error('该用户名已存在'))
        } else {
          callback()
        }
      }, 1000)
    }
  }
}
</script>

在上述示例中,我们通过在校验规则中添加noop: true来延迟显示错误信息。当表单项失去焦点时,异步校验请求会发出,但错误信息不会立即显示。只有当校验结果返回后,如果校验不通过,则错误信息才会显示。

总结

在Element UI中,我们可以通过自定义校验规则的方式来实现表单的异步校验功能。同时,我们还可以使用noop属性来延迟显示错误信息,以提高用户体验。希望本篇博客能够帮助读者解决Element UI中的表单校验与异步验证问题。


全部评论: 0

    我有话说: