The component has no errors, but in the index file where I actually call the input component, it has an error because it cannot use register = {register}.
What is missing? Or what's wrong?
The component has no errors, but in the index file where I actually call the input component, it has an error because it cannot use register = {register}.
What is missing? Or what's wrong?
OK here the problems:
register to props in the Input component props declarationregister passed as prop, not a new one created with useForm in Input componenthere the working <Input> component with comments:
import React, { InputHTMLAttributes } from "react";
import {
FieldValues,
UseFormRegister,
// useForm, // don't need this import
} from "react-hook-form";
interface InputProps extends InputHTMLAttributes<HTMLInputElement> {
id: string;
label: string;
register: UseFormRegister<FieldValues>; // declare register props
}
const Input: React.FC<InputProps> = ({ id, label, register, ...rest }) => {
//const { register } = useForm(); // don't use a new `register`, use the one from props
return (
<div className="input-block">
<label htmlFor={id}>{label}</label>
<br />
<br />
{/* react-hook-form v6 */}
{/* you must declare the `name` attribute on the input element */}
<input name={id} type="text" id={id} ref={register} {...rest} />
{/* react-hook-form v7 */}
{/* In v7 the register() function returns all the needed properties */}
{/* see: https://dev.to/bluebill1049/what-s-coming-in-react-hook-form-version-7-4bfa */}
{/* <input type="text" id={id} {...register(id)} {...rest} /> */}
</div>
);
};
export default Input;
register prop is actually of type UseFormRegister<FieldValues>.register: UseFormRegister<FieldValues>; this is the expected type. You can import them as import { FieldValues, UseFormRegister } from "react-hook-form";ref={register} with {...register(id)} (and remove the name property) as in v7 register('name') provides all the needed props for the input element, see this post about v7 changes: dev.to/bluebill1049/…Type 'FieldValues' is missing the following properties from type and then it lists all my form fieldsI found an article that helped me find the solution.
Codebox has the right solution for those who want to use typescript componentization using React Hook Form.
In this case register prop should be something that extends FieldValues not be a FieldValues
There is a complete example at https://stackoverflow.com/a/77636341/1633344