Я работаю над приложением Reaction Chap, которое извлекает данные из базы данных Firebase. В моем компоненте «Dashboard» у меня есть проверка ловушки useEffect для аутентифицированного пользователя, и, если это так, извлекает данные из firebase и устанавливает состояние переменной электронной почты и переменной чатов. Я использую abortController для очистки useEffect, однако всякий раз, когда я впервые выхожу из системы и снова вхожу в систему, я получаю предупреждение об утечке памяти.
index.js: 1375 Предупреждение. Невозможно выполнить обновление состояния React для отключенного компонента. Это не работает, но это указывает на утечку памяти в вашем приложении. Чтобы исправить, отмените все подписки и асинхронные задачи в функции очистки useEffect.
в Dashboard (создан Context.Consumer)
Изначально у меня не было abortController, я простовернул консольный лог на clean up. Провел дополнительные исследования и обнаружил abortController, однако в примерах используются fetch и signal, и я не смог найти никаких ресурсов по использованию с async / await. Я открыт для изменения способа извлечения данных (будь то с помощью fetch, async / await или любого другого решения) Я просто не смог заставить его работать с другими методами.
const [email, setEmail] = useState(null);
const [chats, setChats] = useState([]);
const signOut = () => {
firebase.auth().signOut();
};
useEffect(() => {
const abortController = new AbortController();
firebase.auth().onAuthStateChanged(async _user => {
if (!_user) {
history.push('/login');
} else {
await firebase
.firestore()
.collection('chats')
.where('users', 'array-contains', _user.email)
.onSnapshot(async res => {
const chatsMap = res.docs.map(_doc => _doc.data());
console.log('res:', res.docs);
await setEmail(_user.email);
await setChats(chatsMap);
});
}
});
return () => {
abortController.abort();
console.log('aborting...');
};
}, [history, setEmail, setChats]);
Ожидаемый результат - правильно очистить / отменить все асинхронные задачи в функции очистки useEffect. После того, как один из пользователей выходит из системы, либо тот же или другой пользователь снова входит в систему, я получаю следующее предупреждение в консоли
index.js: 1375 Предупреждение: не удается выполнить обновление состояния React на отключенном компьютере. составная часть. Это не работает, но это указывает на утечку памяти в вашем приложении. Чтобы исправить, отмените все подписки и асинхронные задачи в функции очистки useEffect.
в Dashboard (создан Context.Consumer)