javascript - 是的,当嵌套对象内的条件时
问题描述
所以我在使用 yup 进行条件验证时遇到问题。基本上我希望在未切换复选框时运输具有所需的属性。我正在使用 yup 的when
功能,但我不知道如何从该嵌套对象中引用sameShippingAsBilling
布尔值。shipping
当复选框为假时,一切正常,显示错误...但是当复选框被选中时,我收到此错误:"Cannot use 'in' operator to search for 'default' in undefined"
问题是is
回调中的值未定义。when
是否甚至可以从这些嵌套对象中访问外部变量。有什么替代方法可以做到这一点?
这是沙盒示例
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", {
is: !val || val === false,
then: Yup.string().required(),
}),
country: Yup.string().when("sameShippingAsBilling", {
is: !val || val === false,
then: Yup.string().required(),
})
})
});
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(),
}),
}),
推荐阅读
- java - 需要从 List 中的每个文件中读取每 N 行
- vue.js - 创建一个新的 vue-moveable 实例
- python - 如何始终在 Python 中导入一组模块
- swift - 虽然当前导航然后显示视图控制器栏按钮不来,为什么在 swift
- javascript - 在我的表单按钮上调用 submit() 和 reload() 不起作用
- minecraft - 当我尝试构建我的 jar 文件(java)时,获取包 org.bukkit 不存在
- php - 在php中使用通配符更改多维数组值?
- python - 如何创建用于猪拉丁语和 izzle 翻译的代码以及同时应用它们的代码?
- azure-storage - Azure blob 存储:同一 Azure 存储帐户中跨容器的块 blob 同步副本不起作用
- javascript - 将数组拆分成块并重复前面的元素