是的,当嵌套对象内的条件

如何解决是的,当嵌套对象内的条件

所以我在使用 yup 进行条件验证时遇到了问题。 基本上,当复选框未切换时,我希望运输具有所需的属性。 我正在使用 yup 的 when 功能,但我不知道如何从该 sameShippingAsBilling 嵌套对象中引用 shipping 布尔值。

当复选框为 false 时,一切正常,显示错误... 但是当复选框被选中时,我收到这个错误"Cannot use 'in' operator to search for 'default' in undefined"

问题是 is 回调中的值未定义。 是否可以从这些嵌套对象访问 when 中的外部变量。这样做的替代方法是什么?

这里是沙箱 example

const schema = Yup.object({
  sameShippingAsBilling: Yup.bool(),billing: Yup.object({
    line1: Yup.string().required(),city: Yup.string().required(),country: Yup.string().required()
  }),shipping: Yup.object({
    line1: Yup.string().when("sameShippingAsBilling",{
      is: !val || val === false,then: Yup.string().required(),}),city: Yup.string().when("sameShippingAsBilling",country: Yup.string().when("sameShippingAsBilling",})
  })
});

const addrValues = { line1: "",city: "",country: "" };

const formOpts = {
  mode: "onChange",reValidateMode: "onChange",defaultValues: {
    sameShippingAsBilling: true,billing: { ...addrValues },shipping: { ...addrValues }
  },resolver: yupResolver(schema)
};

export default function CheckoutForm() {
  const methods = useForm(formOpts);
  const { watch } = methods;

  const shippingAsBilling = watch("sameShippingAsBilling");

  const onSubmit = async (data) => {
    console.log(data);
  };

  return (
    <MuiThemeProvider theme={createMuiTheme()}>
      <FormProvider {...methods}>
        <form onSubmit={methods.handleSubmit(onSubmit)} novalidate>
          <pre>errors: {JSON.stringify(methods.errors,null,2)}</pre>

          <div className="group">
            <FormTextField name="billing.line1" />
            <FormTextField name="billing.city" />
            <FormTextField name="billing.country" />
          </div>

          <div>
            <FormCheckBox name="sameShippingAsBilling" />
          </div>

          {!shippingAsBilling && (
            <div className="group">
              <FormTextField name="shipping.line1" />
              <FormTextField name="shipping.city" />
              <FormTextField name="shipping.country" />
            </div>
          )}

          <div>
            <button type="submit">Pay</button>
          </div>
        </form>
      </FormProvider>
    </MuiThemeProvider>
  );
}

解决方法

您可以根据 shipping 值有条件地渲染 sameShippingAsBilling 对象的形状。

大致如下:

sameShippingAsBilling: Yup.bool(),shipping: Yup.object().when("sameShippingAsBilling",{
    is: (sameShippingAsBilling) => !sameShippingAsBilling,then: Yup.object().shape({
      line1: Yup.string().required(),city: Yup.string().required(),country: Yup.string().required(),}),otherwise: Yup.object().shape({
      line1: Yup.string(),city: Yup.string(),country: Yup.string(),
,

嗯,我在运输中添加了 .nullable().default(null),显然它有效。 从技术上讲仍然无法访问布尔值真/假,它可以工作,因为 val 未定义并且它添加了所需的条件...... 对于临时解决方案,它很好,我不必摆弄 .test() 或其他奇怪的解决方案。 现在我什至不在乎一个库将其称为“死的简单对象模式验证”,而我却在这些简单的事情上浪费时间。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?