Reactjs和Yup,ReactHook表单集成存在问题

Reactjs和Yup,ReactHook表单集成存在问题,reactjs,validation,yup,react-hook-form,Reactjs,Validation,Yup,React Hook Form,我正在使用yup和react钩子表单来验证用户提交。我正在创建一个发送短信、电子邮件和推送通知的应用程序。用户可以通过一组复选框指定联系他们的地点。这3个复选框更新一个有状态对象,默认情况下如下所示: const [checkboxes, setCheckboxes] = useState({ phone: false, email: false, push: false, }); 在提交表单之前,我需要验证其中至少有一个已更改为true,如果没有,我希望在消息

我正在使用yup和react钩子表单来验证用户提交。我正在创建一个发送短信、电子邮件和推送通知的应用程序。用户可以通过一组复选框指定联系他们的地点。这3个复选框更新一个有状态对象,默认情况下如下所示:

  const [checkboxes, setCheckboxes] = useState({
    phone: false,
    email: false,
    push: false,
  });
在提交表单之前,我需要验证其中至少有一个已更改为true,如果没有,我希望在消息中抛出一个错误。为此,我找到了yup的.test函数,并尝试以下操作:

  fieldset: yup
    .object()
    .shape({
      phone: yup.bool(),
      email: yup.bool(),
      push: yup.bool(),
    })
    .required()
    .test(
      "comms-Selected",
      "Please specify at least one means to be contacted",
      (value) =>
        value.phone === true || value.email === true || value.push === true
    ),

我不确定这个验证器函数的语法,yup文档让我头晕目眩。我知道它不起作用,因为我可以提交所有字段都未选中的表单。有人能帮助我了解如何正确编写此自定义验证器吗?

发现此问题,已进行修改以满足您的需要

HTML


选择1
选择2
选择3
{errors.choices&&{errors.choices.message}

}
感谢您的回复和回答。我发现了问题所在。我的语法很好。昨天晚上,我在醉醺醺中意外地将react hook表单更新为一个新版本,而在新版本中,有第二个依赖项,并且声明yup解析器的语法略有不同。瞧,添加依赖项并更改代码中的一行使我上面的原始代码正常工作。对于同一艘船上的任何人,请查阅react hook表单文档!他们与模式验证器的集成发生了微小的变化

react hook表单5.x.x的原始行和依赖项:

import { useForm } from "react-hook-form";
import * as yup from "yup";

  const { register, handleSubmit, setValue, errors } = useForm({
    validationSchema: ContactSchema, //name of your schema goes here
  });
修改了反应钩表6.x.x:

import { useForm } from "react-hook-form";
import * as yup from "yup";
import { yupResolver } from "@hookform/resolvers/yup";

  const { register, handleSubmit, setValue, errors } = useForm({
    resolver: yupResolver(ContactSchema),
  }); 

模式在我看来很好,如何将其与表单连接起来?您在验证对象时是否遇到错误(
{phone:false,email:false,push:false}
)。它与handleSubmit函数连接,该函数适用于我的其他字段,但不适用于自定义验证器。我想知道是否需要使用if语句而不是最后一行的表达式,然后使用else语句来手动创建并分配错误,如果没有任何复选框计算为true。
import { useForm } from "react-hook-form";
import * as yup from "yup";

  const { register, handleSubmit, setValue, errors } = useForm({
    validationSchema: ContactSchema, //name of your schema goes here
  });
import { useForm } from "react-hook-form";
import * as yup from "yup";
import { yupResolver } from "@hookform/resolvers/yup";

  const { register, handleSubmit, setValue, errors } = useForm({
    resolver: yupResolver(ContactSchema),
  });