如何在 FieldArray 中包含不同值的数组的 yup 验证中添加错误消息?

Posted

技术标签:

【中文标题】如何在 FieldArray 中包含不同值的数组的 yup 验证中添加错误消息?【英文标题】:How to add error message to yup validation for array containing distinct values in FieldArray? 【发布时间】:2021-06-18 23:47:53 【问题描述】:

我正在尝试为我的字段数组添加错误消息,它应该包含不同元素的数组。以下是我的验证:

export const emails = yup
  .array(
    yup
      .string()
      .matches(/^\S+@\S+$/, 
        message: "Must be a valid email id"
      )
  )
  .test("Unique", "Email ids need to be unique", values => 
    return new Set(values).size === values.length;
  );

这是我的 FieldArray 组件的渲染道具中的 ErrorMessage 组件:

render=( form, push, remove ) => (
          <div>
            range(0, form.values[name].length).map(i => (
              <div className=styles.inputContainer key=i>
                <div>
                  <InputComponent name=`$name.$i` ...props />
                  <Button color="danger" onClick=() => remove(i)>
                    <FaTimes />
                  </Button>
                </div>
                <ErrorMessage
                  name=`$name.$i`
                  render=msg => (
                    <FormFeedback style= display: "block" >
                      msg
                    </FormFeedback>
                  )
                />
              </div>
            ))
            <Button
              color="info"
              onClick=() => push("")
              disabled=disabled || form.values[name].slice(-1)[0] === ""
            >
              <FaPlus />
            </Button>
          </div>
        )

但是我收到如下所示的错误消息。消息是一个接一个的字母。我理解,因为我将它包含在我的范围渲染方法中。但是我在里面包含了错误消息组件,因为我也想显示无效电子邮件 ID 的错误。

【问题讨论】:

【参考方案1】:

我在某人的帮助下找到了解决方案。如果有人需要,我记下来。

基本上,错误消息组件会打印出任何生成的错误消息。它无法区分错误消息的位置和内容。

所以,我利用了 FieldArray 组件的渲染道具中的form 属性。错误消息作为form.errors 形式的属性出现。 然而,区分这两个 ErrorMessage 组件的关键在于,内部 form.errors 是一个数组,而外部是一个字符串。所以解决方法是检查 form.errors 对象的数据类型。下面是代码sn-p。

render=( form, push, remove ) => (
          <div>
            range(0, form.values[name].length).map(i => 
              return (
                <div className=styles.inputContainer key=i>
                  <div>
                    <InputComponent name=`$name.$i` ...props />
                    <Button color="danger" onClick=() => remove(i)>
                      <FaTimes />
                    </Button>
                  </div>
                  typeof form.errors[name] !== "string" && (
                    <ErrorMessage
                      name=`$name.$i`
                      render=msg => 
                        return (
                          <FormFeedback style= display: "block" >
                            msg
                          </FormFeedback>
                        );
                      
                    />
                  )
                </div>
              );
            )
            typeof form.errors[name] === "string" && (
              <ErrorMessage
                name=`$name`
                render=msg => (
                  <FormFeedback style= display: "block" >
                    msg
                  </FormFeedback>
                )
              />
            )

【讨论】:

以上是关于如何在 FieldArray 中包含不同值的数组的 yup 验证中添加错误消息?的主要内容,如果未能解决你的问题,请参考以下文章

从不同的相关记录组中选择两列之一中包含重复值的所有行

从数组中包含的行索引中选择矩阵的列[重复]

如何使用 redux-form 在不同组件(向上一个组件)中显示 FieldArray 中的字段

如何计算sql中包含非零值的行

Access 2010:根据特定组合框条件过滤字段中包含多个值的报表

如何使用SQL更新VBA Access中包含NULL值的列?