使用 Yup 验证包含对象数组的 formik 字段

Validating formik field containing array of objects using Yup

示例代码:https://codesandbox.io/s/busy-bose-4qhoh?file=/src/App.tsx

我正在尝试构建一个表单,该表单将接受 Criteria 个特定类型的 Criterion 个对象数组:

export interface Criterion {
  field: string,
  op: string,
  values: []
}

export interface Configuration {
  title: string,
  description: string,
  criteria: Criterion[],
}

因此 Configuration 对象可以有多个 Criterion 用于定义网络 API 查询。 我已经走到这一步了,但是虽然 yup 正确地验证了数组,但当它进入 formik 时,它似乎再次将其视为一个字符串,即使类型已定义(我 认为 ) 正确。

这是我所看到的示例,如果您使用这样的数组作为 criteria 值提交表单:

[
  {
    "field": "createdOn",
    "op": "Equal",
    "values": [
      "2020-01-01"
    ]
  }
]

formik 值显示:

 "criteria": "[\n    {\n      \"field\": \"createdOn\",\n      \"op\": \"Equal\",\n      \"values\": [\n        \"2020-01-01\"\n      ]\n    }\n  ]"

有没有办法让 formik 将其视为 javascript 对象数组而不是字符串?

你必须首先将 criteria 的值解析为 JSON(因为它是来自 textarea 的字符串,而不是对象),然后像这样重新分配它:

            let temp = { ...values };
            temp.criteria = JSON.parse(values.criteria);

样本:https://codesandbox.io/s/zealous-northcutt-f0d8k?file=/src/App.tsx