Я пытаюсь создать страницу профиля пользователя, и после получения данных из Firestore я не могу установить данные в состояние userProfile
.
const {userProfile, setUserProfile} = useState(null);
const getUserProfile = async () => {
await firestore().collection("Users")
.doc(user.uid)
.get()
.then(documentSnapshot => {
if (documentSnapshot.exists) {
console.info('User data from Firestore: ', documentSnapshot.data());
setUserProfile(documentSnapshot.data());
}
});
}
useEffect (() => {
if (userProfile == null) {
getUserProfile();
console.info("User Data in userProfile state: ", userProfile);
}
}, [userProfile])
Я получил эту ошибку:
Журнал консоли показывает, что состояние userProfile
не определено, однако я могу без проблем получить данные из Firestore, как показано в журнале консоли.
Похоже, вы используете API веб-версии 8, ваш код полностью соответствует документам, за исключением двойного вызова documentSnapshot.data()
, как указано в первом комментарии. Каков будет результат, если вы сначала сохраните documentSnapshot.data()
локально, затем зарегистрируете значение и поставите в очередь обновление состояния? Для ошибки просто добавьте блок catch в цепочку Promise.
const {userProfile, setUserProfile} = useState(null); <----- error is here
const getUserProfile = async () => {
await firestore().collection("Users")
.doc(user.uid)
.get()
.then(documentSnapshot => {
if (documentSnapshot.exists) {
console.info('User data from Firestore: ', documentSnapshot.data());
setUserProfile(documentSnapshot.data());
}
});
}
useEffect (() => {
if (userProfile == null) {
getUserProfile();
console.info("User Data in userProfile state: ", userProfile);
}
}, [userProfile])
Вместо const {userProfile, setUserProfile} = useState(null);
замени на const [userProfile, setUserProfile] = useState(null);
Потому что ты используешь
curly brackets
в {userProfile,setUserProfile}
вам нужно заменить его на
square brackets
[userProfile,setUserProfile]
1.
documentSnapshot.exists
— это функция. Нужно сделатьif (documentSnapshot.exists())
. 2. Что произойдет, если выconsole.info(documentSnapshot.data())
дважды перед тем, как вызватьsetUserProfile
? Мне любопытно, может быть,documentSnapshot.data()
нельзя вызывать дважды.