register 返回一个具有以下结构的对象:
{
onChange: function(){},
onBlur: function(){},
ref: function(){}
}
目前您只是传递从register 函数返回的对象,但您可以向输入的onChange 添加一些其他功能,如下例所示(这里我们通过调用来重置表单中的另一个字段resetField):
const Input = React.forwardRef(({ inputId, ...otherProps }, ref) => {
return <input id={inputId} ref={ref} {...otherProps} />;
});
const schema = yup.object().shape(
{
second: yup
.number()
.nullable()
.transform((value, originalValue) =>
String(originalValue).trim() === '' ? null : value
),
minute: yup
.number()
.nullable()
.transform((value, originalValue) =>
String(originalValue).trim() === '' ? null : value
),
triggerName: yup.string().required(),
}
);
function TestForm() {
const {
handleSubmit,
register,
formState: { errors },
resetField,
} = useForm({
resolver: yupResolver(schema),
});
console.log(errors);
const onSubmit = (data) => {
if (!data.minute && !data.second) {
alert('on of minute or second field must has value');
return false;
}
alert('success');
console.log(data);
};
const { onChange: onSecondChange, ...secodField } = register('second');
const { onChange: onMinuteChange, ...minuteField } = register('minute');
return (
<form onSubmit={handleSubmit(onSubmit)}>
<Input
inputId="second"
type="number"
{...secodField}
onChange={(e) => {
onSecondChange(e);
resetField('minute');
}}
/>
<Input
inputId="minute"
type="number"
{...minuteField}
onChange={(e) => {
onMinuteChange(e);
resetField('second');
}}
/>
<Input
inputId="trigger-name"
label="triggerName"
{...register('triggerName')}
/>
<input type="submit" value="submit" />
</form>
);
}
我已验证 minute 或 second 在 onSubmit 函数中具有价值,因为我不完全了解您的业务关于填写两者或其中之一,但如果您愿意,您可以通过以下方式处理此验证yup 通过使用 when 方法或在您的架构上定义一些自定义规则。