Итак, я извлекаю данные из своей базы данных, используя API с этим кодом:
let { id } = useParams();
const [Tenant, setTenant] = useState("");
useEffect(() => {
axios.get(`http://localhost:3001/tenants/byId/${id}`).then((response) => {
setTenant(response.data);
});
}, []);
Затем я пытаюсь установить значение по умолчанию в текстовом поле пользовательского интерфейса материала, используя:
<TextField
required id = "Field1"
defaultValue = {Tenant.tenantName}
label = "Tenant Name"
variant = "outlined"
onChange = {(event) => {setNtenantName(event.target.value)}}
/>
Но я ничего не получал. Поэтому я решил console.info(Tenant.tenantName)
и получил это в своей консоли:
Ваше состояние не готово к тому времени, когда вы пытаетесь получить к нему доступ.
Так что можете проверить.
{Tenant && (
<TextField
required id = "Field1"
defaultValue = {Tenant.tenantName}
label = "Tenant Name"
variant = "outlined"
onChange = {(event) => {setNtenantName(event.target.value)}}
/>
)}
также, кстати, не принято использовать заглавные буквы в именах штатов.
вы можете изменить его на: const [tenant, setTenant] = useState("");
просто для условности
То, что предлагает Кевин, должно работать хорошо, но вы также можете сделать что-то подобное, что может быть легче читать и будет отображать загрузчик во время выборки данных.
if (Tenant === undefined) return <div>Loading data....</div>
else return (
<TextField
required id = "Field1"
defaultValue = {Tenant.tenantName}
label = "Tenant Name"
variant = "outlined"
onChange = {(event) => {setNtenantName(event.target.value)}}
/>
)
Потому что вы делаете
Tenant.tenantName
, и ваше состояние изначально представляет собой пустую строку, не имеющую свойстваtenantName
. Ваше состояние устанавливается на данные вашего API только после завершения вашего запроса Axios GET (что происходит не сразу и занимает некоторое время)