На рисунке ниже показана конечная точка / library приложения Apollo / React с такой структурой:
<App/>
<Home/>
<Library/> // Only renders if a user is logged in
Если пользователь вошел в систему, компонент приложения получает из моей серверной базы данных (внутри запроса «я») идентификаторы игр в библиотеке пользователя, и, когда пользователь переходит в библиотеку, эти идентификаторы используются для получения игр. детали из стороннего API.
Эта выборка в настоящее время выполняется с помощью Apollo useQuery () в <Library/>, но это вызывает обычное предупреждение Can't perform a React state update on an unmounted component, когда пользователь выходит из системы и <Library/> размонтируется.
Что было бы лучшим местом и методом для работы с асинхронным состоянием этого компонента? (без Redux). Поднять состояние до компонента приложения? Какой-то useEffect в компоненте библиотеки с useLazyQuery вместо useQuery?
Ура =)
Обновлено: по запросу, вот упрощенная версия компонента библиотеки (он извлекает идентификаторы игр непосредственно из серверной части, не требуя идентификаторов игр из запроса me)
const Library = () => {
const { data: libraryResponse, loading: libraryLoading } = useQuery(
GET_LIBRARY
);
if (libraryLoading) return <FullPageSpinner />;
const games = libraryResponse?.getLibrary;
if (!games) {
return (
<div>
<div>Your library is empty.</div>
<Link to = {'/home'}>Click here to find games!</Link>
</div>
);
}
return <GameList games = {games} />;
};
edit2: Я могу подтвердить, что использование useLazyQuery + useEffect вместо useQuery избавляется от предупреждения, я не уверен, идеально ли это или предназначено:
Спасибо, добавил упрощенную версию <Library/> =) Я попробую использовать useLazyQuery, но разве асинхронный ответ uselazyquery не вызовет такую же потенциальную проблему, если ответ приходит после выхода пользователя из системы и размонтирования компонента? Я видел несколько причудливых решений для этого, например, компонент useAsync headbutt.io/picking-apart-kents-useasync Kent C Dodd / s, но они немного сложны для моих целей, и мне было интересно, предоставил ли Apollo более простой способ.
Я могу подтвердить, что использование useLazyQuery + useEffect вместо useQuery избавляет от предупреждения, я не уверен, идеально это или задумано. github.com/apollographql/apollo-client/issues/…
Да, кажется слишком сложным использовать тот, который вы упомянули, с useasync, поскольку большая часть того, что вам нужно, уже предоставлено в Apollo.





Если вам не нужен ваш запрос к компоненту приложения, имеет смысл просто оставить его в
<Library/>. Я все еще не уверен, что находится внутри вашей библиотеки и как она работает, поэтому можете ли вы предоставить больше кода. Однако похоже, что многие люди получали это предупреждение. В github есть огромная ветка, в которой рассказывается о вашей конкретной проблеме. github.com/apollographql/apollo-client/issues/6209 Вы также можете использовать useLazyQuery и просто вызвать свой эффект при монтировании, если это сработает для вас