我一直在使用带有本机元素的反应钩子表单库,但想使用 Controller API 切换到自定义组件。
我的自定义输入组件更新 React 状态但没有更新表单状态中的 ref 时遇到问题。因此,必填字段始终被标记为无效,我无法提交表单。
这是我的问题的演示:https ://codesandbox.io/s/react-hook-form-controller-bofv5
它应该在提交时注销表单数据 - 但提交永远不会发生,因为表单无效。
我一直在使用带有本机元素的反应钩子表单库,但想使用 Controller API 切换到自定义组件。
我的自定义输入组件更新 React 状态但没有更新表单状态中的 ref 时遇到问题。因此,必填字段始终被标记为无效,我无法提交表单。
这是我的问题的演示:https ://codesandbox.io/s/react-hook-form-controller-bofv5
它应该在提交时注销表单数据 - 但提交永远不会发生,因为表单无效。
我想我已经缩小了你的问题。首先,我rules={{ required: true }}
从控制器中删除并尝试了表单。它告诉我firstName: undefined
。然后我注释掉了这个onChange
属性。之后,表格工作正常。如果您想提供自定义值提取器,似乎onChange
应该使用它。该值需要从函数返回。一个简单输入的例子是:onChange={([{target}]) => target.value}
reference。此外,重要的是要注意handleSubmit
提取一些带有值的内部状态,就像您不需要自己跟踪这些状态一样。
这个更新的组件似乎正在工作:
function App() {
const { control, handleSubmit, errors } = useForm();
// const [data, setData] = useState({ firstName: "" });
const onSubmit = data => console.log(data);
// const onChangeHandler = e => {
// const { name, value } = e.target;
// const _data = { ...data };
// _data[name] = value;
// setData(_data);
// };
return (
<>
{/* <p>{JSON.stringify(data)}</p> */}
<form onSubmit={handleSubmit(onSubmit)}>
<Controller
as={Input}
name="firstName"
id="firstName"
label="First Name"
control={control}
// value={data.firstName}
rules={{ required: true }}
errors={errors.firstName}
// onChange={([e]) => onChangeHandler(e)}
/>
<input type="submit" />
</form>
</>
);
}
只是一个旁注,我从来没有使用过这个图书馆,所以只要你能折腾我就相信我。