Vuelidate 无法按程序生成表单验证

Vuelidate unable to procedurally generate form validation

所以我目前正在努力将高度 re-usable 的表单提取到 VueJS (Vue2) 的子组件中。这种形式在我的实际应用程序中很长,因此我决定从 JSON 文件中按程序生成它,而不是对其进行硬编码。现在,我费了好大劲才让它开始工作,却找不到错误发生的地方。所以我做了以下更简单的版本来帮助找到问题。

https://jsfiddle.net/c2ba7p3r/(具体参见第 78-94 行和第 101-110 行)

进一步说明:

在此应用程序中,有一个包含所有表单数据的数组(与导入的 JSON 非常相似)。由 object 组成,每个代表表单的一部分。在每个所述 object 中,有一个标题属性,以及随后的 object 数组,将用于生成输入字段。像这样:

let example_array = [
   {
      title: "Section 1",
      inputs: [
         {
            // Input 1A
            id: "name",
            label: "Full Name",
            required: true,
            validate: { constraint: "minimum_text",   param: 2  }
         },
         {...}  // Input 1B
                // etc.
      ]
   },
   {
      title: "Section 2",
      inputs: [
         {...}, // Input 2A
         {...}  // Input 2B
                // etc.
      ]
   },
   // etc.
]

现在,这个表单模板数组作为 prop 传递给自定义表单组件。在自定义表单组件中,我从上面的 JSON 中提取所有输入,并将它们展平到一个数组中。从那里,我将从数组中获取这些输入中的每一个,并为每个输入添加一个 属性 到 data object(在 data 函数中)。

完成此操作后,我以类似的方式创建验证。在验证函数中,我遍历扁平化输入数组,提取 required 属性 和 validate sub-object,并从中创建验证。

最后,我有了我的模板,它有一个嵌套 v-for 循环。第一个 v-for 遍历原始表单模板数组(作为道具传入),并创建每个部分,包括部分标题。从那里,我有第二个 v-for 循环生成每个表单部分的输入。

到目前为止,没有任何错误。但是,当然,问题就在这里……在模板生成的最后一点,我分配了条件错误 class,我无法使用表达式访问验证 object,这是必要的,因为v-for 为每个输入分配适当的验证。特别是,$v.inputs[input.id] 未定义,导致 $v.inputs['input.id'].$invalid(或 $error 或诸如此类)的访问失败。它不会因特定的 属性 访问而失败,例如 $v.inputs['name']$v.inputs['url'] 或诸如此类的东西,但是这违背了使用 v-for.

的目的

谁能发现我做错了什么?感觉我在库中发现了一个错误,但我怀疑真正发生的是我只是滥用了库或 JavaScript.

谢谢

您希望通过 form-error class

突出显示无效字段
    :class="{ 'form-error': $v.inputs[input.id].$invalid }"

但是您的 description 字段未经验证并且您的代码在 $v.inputs['description'].$invalid 上失败 解决方案是为所有字段构建空验证散列

            { 
              type: "text",
              id: "description",
              label: "Site Description",
              validate: {},                //!!!!
            },
validations: function () {
    const validator = {
      inputs: {}
    }

        // Parse the validation rules passed in from the object (would likely be JSON)
    this.all_form_inputs.forEach((input) => {
      // * No validation is needed
      if(!input.required) {
        validator.inputs[input.id] = {} //!!!

        return
      }

https://jsfiddle.net/qzfm34sa/

这只是快速调试解决方案,希望您能构建一个更健壮的解决方案。