Проблема в том, что обновление состояния, выполняемое с помощью setId(<some id>)
, является асинхронным c. Поэтому вы не сможете сразу получить доступ к вновь установленному идентификатору.
Для обработки таких ситуаций, в которых некоторый код зависит от обновленного состояния, был введен хук useEffect . Он вызывается после того, как ваш компонент обновляется с новым состоянием и принимает массив зависимостей (в вашем случае это id
).
В вашем случае вы можете использовать его так:
useEffect(() => {
// check that id is already set
if (id) {
axios.put(
url + id,
body,
{
headers: {
Authorization: authHeader,
"Content-Type": "application/xml",
},
}
).then(() => {
setIsLoading(false);
}).catch(error => {
//handle errors here if needed.
})
}
}, [id, setIsLoading]);
Обратите внимание, поместите это под функцией useState (const [id, setId] = useState("");
)
UPDATE
Оказалось, что идентификатор не нужен в состоянии и запрос на размещение должен выполняться при вызове setDevice, а не при изменении идентификатора. В этом случае использование хука useEffect
не требуется, и запрос на размещение может быть выполнен с полученным id
:
const setDevice = async () => {
try {
const response = await axios.get("url" + serialNumber, {
headers: { Authorization: authHeader },
});
const id = response.data.mobile_devices[0].id;
await axios.put(
url + id,
body,
{
headers: {
Authorization: authHeader,
"Content-Type": "application/xml",
},
}
)
} catch (err) {
setError("Something went Wrong");
setIsLoading(false);
setShowModal(false);
setShowErrorModal(true);
}
};