#javascript #reactjs #firebase #firebase-authentication
#javascript #reactjs #firebase #firebase-аутентификация
Вопрос:
Я использую Firebase onSnapshot
для обновления моего текущего пользователя.
Я сохраняю состояние, используя UseState
и прослушивая изменения Firebase UseEffect
.
Он отлично работает при первом запуске приложения, но когда я обновляю страницу (ctrl R), он перестает работать.
В настоящее время я пытаюсь отправить эти данные с помощью Context Provider
и получить к ним прямой доступ Context Consumer
, но, конечно, после того, как я исправлю эту ошибку, я заменю ее настоящими компонентами.
Это мой App.js
код:
const App = () => {
const [loggedUser, setLoggedUser] = useState(null);
useEffect(() => {
firebaseHandler.listenToUserUpdates((currentUser) => {
setLoggedUser(currentUser);
console.log('Updated');
});
}, []);
if (loggedUser == null) {
return <Login />;
}
return (
<CurrentUserContext.Provider value={{loggedUser, setLoggedUser}}>
<CurrentUserContext.Consumer>
{value => <h1>{value.loggedUser.production.name}</h1>}
</CurrentUserContext.Consumer>
</CurrentUserContext.Provider>
);
}
И это код для firebaseHandler.listenToUserUpdates
:
listenToUserUpdates(onChange) {
this.auth.onAuthStateChanged((user) => {
if(user == null) {
onChange(null);
return;
}
this.fetchCurrentUserAndProduction(user.uid, (currentUser) => { //Production is another doc on Firebase Firestore which I fetch and attach to the user's object
onChange(currentUser);
});
});
}
Комментарии:
1. Когда вы говорите «перестает работать», что вы имеете в виду? Что вы видите? Есть ли шанс, что вы можете настроить демонстрационный репозиторий, чтобы мы могли взглянуть на него?
2. @LukeStorry Пользовательский интерфейс не изменяется. Даже несмотря на «обновленную» консоль. вызывается журнал. Поэтому
setLoggedUser
по какой-то причине пользовательский интерфейс не обновляется3. Если вы запустите этот код в отладчике и пройдетесь по каждой строке, какая строка не выполняет то, что вы ожидаете от нее при перезагрузке?
4. Попробуйте расширить
console.log
, чтобы также вывести значениеcurrentUser
переменной.