Метод setUserData()
является асинхронным, что означает, что ничто не мешает написанному коду после его выполнения до завершения его собственной логики. Это верно для всех методов обновления состояния.
Вероятно, происходит то, что блок sessionStorage.setItem()
запускается до того, как вы полностью обновите состояние в предыдущем блоке. Так что в localStorage не нужно ничего сохранять в первый раз. Но при последующих попытках состояние обновляется с помощью токена / пользовательской информации из предыдущего обновления.
Существует несколько способов решения этой проблемы:
1) Это просто обновить локальное хранилищес переменными, которые вы создали, вместо ожидания завершения состояния:
const login = async (email, password) => {
try {
const user = await loginUser({
variables: {
email,
password
}
});
const { userId, token, expiresIn } = user.data.loginUser;
setUserData({
token: token,
userId: userId,
expiresIn: expiresIn
})
sessionStorage.setItem('interdevs-data', JSON.stringify({
"token": token,
"userId": userId,
"expiresIn": expiresIn
}));
} catch(err) {
setLoginErr(err);
};
};
2) Используйте useEffect()
для обновления localStorage при изменении состояния.
useEffect(() => {
sessionStorage.setItem('interdevs-data', JSON.stringify({
"token": userData.token,
"userId": userData.userId,
"expiresIn": userData.expiresIn
}));
}, [user]) //swap user with whatever you called your state
const login = async (email, password) => {
try {
const user = await loginUser({
variables: {
email,
password
}
});
const { userId, token, expiresIn } = user.data.loginUser;
setUserData({
token: token,
userId: userId,
expiresIn: expiresIn
})
} catch(err) {
setLoginErr(err);
};
};