I'M使用ZOD与反应式钩形式使用,以验证必须提供两个字段(
warehouses
或clusters
)中的至少一个形式。这两个字段都是字符串的可选阵列。我正在使用.refine
来强制执行此逻辑,但是错误消息未显示为字段。
这里是我的Zod模式:
const schema = z.object({
warehouses: z.array(z.string()).optional(),
clusters: z.array(z.string()).optional(),
})
.refine((data) => (data.warehouses?.length ?? 0) > 0 || (data.clusters?.length ?? 0) > 0, {
message: 'At least one warehouse or cluster must be provided',
path: ['warehouses', 'clusters'],
});
i'm使用来自React-Hook-Form的控制器的自定义FormField组件,但该字段未显示错误消息。问题不在我的自定义FormField中,而是在Zod模式及其错误处理程序中
我的形式是我的formfield组件:
<FormField
form={form}
label={'Warehouses'}
name="warehouses"
render={({ field, fieldState }) => (
<AutofillMultibox
field={field}
choices={['South', 'East', 'West'].map((e) => ({
label: e,
value: e,
}))}
/>
)}
/>
<FormField
form={form}
label={'Clusters'}
name="clusters"
render={({ field, fieldState }) => (
<AutofillMultibox
field={field}
choices={['South', 'East', 'West'].map((e) => ({
label: e,
value: e,
}))}
/>
)}
/>
Well,
locations: z.discriminatedUnion('type', [
z.object({
type: z.literal('warehouses'),
warehouses: z.array(z.string()).min(1, 'Choose at least 1 warehouse'),
clusters: z.array(z.string()).default([]),
}),
z.object({
type: z.literal('clusters'),
clusters: z.array(z.string()).min(1, 'Choose at least 1 cluster'),
warehouses: z.array(z.string()).default([]),
}),
]),