I want to provide default values in the input field using react-hook-form
. First I retrieve the user data from the API endpoint and then setting the state users
to that user data. Then I pass the state users
to the defaultValues
of useForm()
.
import React, { useState, useEffect } from "react";
import { useForm } from "react-hook-form";
import axios from "axios";
function LoginFile() {
const [users, setUsers] = useState(null);
useEffect(() => {
axios
.get("http://localhost:4000/users/1")
.then((res) => setUsers(res.data));
}, []);
useEffect(() => {
console.log(users);
}, [users]);
const { register, handleSubmit, errors } = useForm({
defaultValues: users,
});
return (
<div>
<form onSubmit={handleSubmit(onSubmit)}>
Email <input type="email" name="email" ref={register} /><br />
firstname <input name="firstname" ref={register} /><br/>
<input type="submit" />
</form>
</div>
);
}
export default LoginFile;
I did by the above code but didn't work as expected. All the input fields are still empty. I want to have some default values in the input field of my form.
The problem is that during the first render,
users
is theuseState
hook's initial value, which isnull
. The value only changes after theaxios.get()
request finishes, which is after the initial render. This means that the the default values passed touseForm
isnull
.The documentation for defaultValues says the following:
So, you'll just need to use
reset
to reset the form manually to the values which you fetch. The documentation forreset
says the following:However, it's unclear from the documentation whether
null
is enough as the defaultValues, or if you need to pass it a proper object with fields for each input. To play it safe, let's assume it's the latter.The code for doing this would look something like this:
Additionally, if the only reason for the useState hook is to store the value for
defaultValues
, you don't need it at all and can clean up the code to be: