我正在使用react-hook-form的Controller呈现一个自定义组件。
如果在使用register时发生错误,则焦点正常,但控制器不正常。
当Custom组件只处理一个输入时,我能够找到一种方法来处理错误,但是当它有多个输入时,我找不到一种方法来处理它。
Form.js
import { Controller, useForm } from "react-hook-form";
import CustomInput from "./CustomInput";
import * as yup from "yup";
const schema = yup.object({
name: yup.object().shape({
first: yup.string().required(),
last: yup.string().required(),
}),
});
function Form() {
const {
handleSubmit,
control,
formState: { errors },
} = useForm({
defaultValues: { name: { first: "", last: "" } },
resolver: yupResolver(schema),
});
const onSubmit = (data) => console.log(data);
return (
<form onSubmit={handleSubmit(onSubmit)}>
<Controller
name="name"
control={control}
rules={{ required: true }}
render={({ field }) => (
<CustomInput
value={field.value}
onChange={(value) => field.onChange(value)}
errors={errors}
/>
)}
/>
<button type="submit">Send</button>
</form>
);
}
export default Form;CustomInput.js
function CustomInput({ value, onChange, errors }) {
const changeFirst = (e) => {
onChange({ first: e.target.value, last: value?.last });
};
const changeLast = (e) => {
onChange({ first: value?.first, last: e.target.value });
};
return (
<div>
<input type="text" value={value.first} onChange={changeFirst} />
<input type="text" value={value.last} onChange={changeLast} />
{errors?.name && (
<p className="errmsg">
{errors?.name?.first?.message || errors?.name?.last?.message}
</p>
)}
</div>
);
}
export default CustomInput;当自定义组件中有多个输入时,如何获得错误焦点?
发布于 2021-10-26 12:26:54
您可以在RHF中使用setFocus。首先,检测errors对象何时发生更改,然后找到包含该对象的第一个字段并调用setFocus(field)
const {
setFocus,
formState: { errors },
...
} = useForm<FormValues>();
React.useEffect(() => {
const firstError = Object.keys(errors).reduce((field, a) => {
return !!errors[field] ? field : a;
}, null);
if (firstError) {
setFocus(firstError);
}
}, [errors, setFocus]);
https://stackoverflow.com/questions/69719627
复制相似问题