为什么 element-ui 的 validate() 函数不断清除服务器端通过验证(通过错误属性)错误?

why does element-ui's validate() function keep clearing server side passed validation (via error prop) errors?

我正在使用 element-ui 表单验证来验证客户端的简单规则,以减轻服务器的额外负载。在初始客户端验证通过后,我将它们发送到服务器并在服务器端进行更多(复杂)验证。

当我收到返回的错误并将它们显示在自定义 built 错误字段时,这没有任何问题。但是当尝试在 error prop 中使用 element-ui 的 built 来显示表单项中的错误时,然后在第二次提交后服务器端错误从表单项中消失。即使我像 error="This is a error message" 这样硬编码错误道具,消息仍然在 运行 validate() 方法之后消失。

这是表格的示例

<el-form :model="form" :rules="rules" ref="form">
    <el-form-item prop="mobile_number" :error="errors.mobile_number[0]">
        <el-input v-model.number="form.mobile_number"> </el-input>
    </el-form-item>
</el-form>

这是我提交表格的部分

    submitForm(){
        this.$refs.form.validate((valid) => {
            if (valid) {
                axios.post(url, 
                    this.form
                ).then((response) => {
                    if(response.data.status == 'success'){
                        // do stuff when successful
                    }
                }).catch((error) => {
                    this.errors = error.response.data.errors;
                })
            }
        });
    }

当我删除 validate() 方法或当我在客户端禁用验证规则时,服务器端仍然存在。我该如何解决这个问题?

在查看源代码后,我发现了这一点。 element-ui 验证对内部流程和外部 prop 错误使用相同的错误消息变量 (validateMessage)。因此,当 validate() 运行时,element-ui 首先检查自己的规则,如果通过则 returns valid true 否则它会创建错误并将它们分配给 validateMessage。

另一方面,传递手动错误元素 ui 正在使用监视错误 prop 的监视程序。

watch: {
error: {
  immediate: true,
  handler: function handler(value) {
    this.validateMessage = value;
    this.validateState = value ? 'error' : '';
  }
},
validateStatus: function validateStatus(value) {
  this.validateState = value;
}

},

因此,为了控制分配给 validateMessage 的内容,需要触发观察者,这只能在 error 属性发生变化时触发,只要它保持不变,内部验证过程将覆盖 validateMessage。

  validator.validate(model, { firstFields: true }, function (errors, invalidFields) {
    _this.validateState = !errors ? 'success' : 'error';
    _this.validateMessage = errors ? errors[0].message : '';

    callback(_this.validateMessage, invalidFields);
    _this.elForm && _this.elForm.$emit('validate', _this.prop, !errors, _this.validateMessage || null);
  });

在我的例子中,因为客户端验证通过规则 validateMessage 设置为“”所以即使服务器端仍然存在错误也不会显示任何错误。

简而言之,当元素服务器端验证程序通过有效时,我会在提交表单之前清除本地错误。如果存在,让它再次设置它们。并且有效。

submitForm(){
    this.$refs.form.validate((valid) => {
        if (valid) {
            this.errors = [];
            axios.post(url, 
                this.form
            ).then((response) => {
                if(response.data.status == 'success'){
                    // do stuff when successful
                }
            }).catch((error) => {
                this.errors = error.response.data.errors;
            })
        }
    });
}