博客 / 詳情

返回

[Vue] el-form 表單驗證的異常情況

本文針對的場景是沒有手動觸發el-form的validator驗證,但是async-validator自動觸發(驗證),控制枱async-validator驗證報錯的情況。

先貼一段代碼:

<template>
  <el-form ref="form" :model="formData" :rules="formRules" label-width="100px" size="medium">
    <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 type="password" v-model="formData.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' },
          { min: 6, max: 20, message: '密碼長度在 6 到 20 個字符之間', trigger: 'blur' }
        ]
      }
    };
  },
  methods: {
    submitForm() {
      this.$refs.form.validate(valid => {
        if (valid) {
          // 表單驗證通過,可以進行提交操作
          // ...
        } else {
          // 表單驗證未通過
          return false;
        }
      });
    }
  }
};
</script>

這段代碼中我們在submitForm時通過this.$refs.form.validate來驗證表單中的username和password字段,這沒有問題。

el-from驗證調用了async-validator,上面的情況是提交時手動觸發validator。

本文説的是沒有手動觸發validator驗證,但是控制枱async-validator報錯(async-validator自動觸發)的情況。

當el-from 上rules屬性綁定的驗證規則發生變化(即 :rules="formRules"中的formRules變更) 無論是formRules的對象內存地址變化,還是對象中的key 或者 key對應的value變更,都會觸發async-validator。

説個場景,如未滿18歲用户需要驗證監護人。用computed來做rules判斷

computed: {
  formRules() {
    const basicRules = {...};
    if (age < 18) {
      return {
      ...basicRules,
      otherRules
      }
    }
    return basicRules;
  }
}

這時候來回切換用户信息,表單就會發生沒有手動觸發校驗,但自行校驗的情況。

解決這個問題有兩種思路
1、拆分rules同時拆分表單,一個表單拆為兩個表單,兩個表單綁定兩套驗證規則
2、不拆分表單,但每次綁定值發生變化時,通過clearValidate()清空驗證狀態。

完結。

同步更新到自己的語雀
https://www.yuque.com/dirackeeko/blog/ih59cyi0r97kcnke

user avatar 201926 頭像 user_ze46ouik 頭像
2 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.