使用嵌套的自定义复选框组件进行 React Hook 表单验证
React Hook Form validation using nested custom checkbox component
我正在使用 React Hook 表单。我制作了一个自定义复选框,如下所示:
const Checkbox = ({ text, className, setCheckbox, checkbox }) => {
const { register } = useFormContext();
const statute = register("statute");
return (
<Wrapper className={className}>
<StyledLabel>
<div>{text}</div>
<StyledInput
type="checkbox"
name="statute"
onChange={(e) => {
statute.onChange(e);
setCheckbox && setCheckbox(!checkbox);
}}
/>
<Checkmark />
</StyledLabel>
</Wrapper>
);
};
复选框 (Checkbox.js) 嵌套在父组件 (Register.js) 中:
const Register = ({ setRegisterView }) => {
const validationSchema = Yup.object().shape({
statute: Yup.bool().oneOf([true], "You need to accept the page statute."),
});
const methods = useForm({
mode: "onSubmit",
resolver: yupResolver(validationSchema),
});
const {
register: validate,
formState: { errors },
handleSubmit,
} = methods;
return (
<Wrapper>
<FormProvider {...methods}>
<Form onSubmit={handleSubmit(registerProcess)}>
<StyledCheckbox
text="Accept the page statute."
setCheckbox={null}
checkbox={null}
/>
{errors.statute && <Error>{errors.statute.message}</Error>}
<LoginButton type="submit">SIGN UP</LoginButton>
</Form>
</FormProvider>
</Wrapper>
);
};
export default Register;
问题是,当我选中复选框时,我在 errors.statute.message 中得到了一条信息:statute must be a `boolean` type, but the final value was: `"on"`.
。
当我改变这个时:
onChange={(e) => {
statute.onChange(e);
setCheckbox && setCheckbox(!checkbox);
}}
对此:
{...register("statute")}
然后它工作得很好并且 errors.statute.message 显示正确的消息,当在复选框输入中选中 = false 时。但是我需要有扩展版本的onChange。
问题是,您没有 link returned ref
register
调用您的 <StyledInput />
。所以只需传播 register
的 return 值——在下面的代码示例中,我还省略了 name
属性,因为它包含在 statute
中。 Here 你可以找到所有道具 register
将 return.
<StyledInput
type="checkbox"
{...statute}
onChange={e => {
statute.onChange(e);
setCheckbox && setCheckbox(!checkbox);
}}
/>
我正在使用 React Hook 表单。我制作了一个自定义复选框,如下所示:
const Checkbox = ({ text, className, setCheckbox, checkbox }) => {
const { register } = useFormContext();
const statute = register("statute");
return (
<Wrapper className={className}>
<StyledLabel>
<div>{text}</div>
<StyledInput
type="checkbox"
name="statute"
onChange={(e) => {
statute.onChange(e);
setCheckbox && setCheckbox(!checkbox);
}}
/>
<Checkmark />
</StyledLabel>
</Wrapper>
);
};
复选框 (Checkbox.js) 嵌套在父组件 (Register.js) 中:
const Register = ({ setRegisterView }) => {
const validationSchema = Yup.object().shape({
statute: Yup.bool().oneOf([true], "You need to accept the page statute."),
});
const methods = useForm({
mode: "onSubmit",
resolver: yupResolver(validationSchema),
});
const {
register: validate,
formState: { errors },
handleSubmit,
} = methods;
return (
<Wrapper>
<FormProvider {...methods}>
<Form onSubmit={handleSubmit(registerProcess)}>
<StyledCheckbox
text="Accept the page statute."
setCheckbox={null}
checkbox={null}
/>
{errors.statute && <Error>{errors.statute.message}</Error>}
<LoginButton type="submit">SIGN UP</LoginButton>
</Form>
</FormProvider>
</Wrapper>
);
};
export default Register;
问题是,当我选中复选框时,我在 errors.statute.message 中得到了一条信息:statute must be a `boolean` type, but the final value was: `"on"`.
。
当我改变这个时:
onChange={(e) => {
statute.onChange(e);
setCheckbox && setCheckbox(!checkbox);
}}
对此:
{...register("statute")}
然后它工作得很好并且 errors.statute.message 显示正确的消息,当在复选框输入中选中 = false 时。但是我需要有扩展版本的onChange。
问题是,您没有 link returned ref
register
调用您的 <StyledInput />
。所以只需传播 register
的 return 值——在下面的代码示例中,我还省略了 name
属性,因为它包含在 statute
中。 Here 你可以找到所有道具 register
将 return.
<StyledInput
type="checkbox"
{...statute}
onChange={e => {
statute.onChange(e);
setCheckbox && setCheckbox(!checkbox);
}}
/>