Все эти ответы предполагают управление кешем, ориентированное на запросы.
Что, если я удалю user
с идентификатором 1
, и на этого пользователя ссылаются в 20 запросах по всему приложению? Читая ответы выше, я должен предположить, что мне придется написать код для обновления кеша всех из них. Это было бы ужасно для долгосрочной поддержки кодовой базы и сделало бы кошмаром любой рефакторинг.
На мой взгляд, лучшим решением будет что-то вроде apolloClient.removeItem({__typeName: "User", id: "1"})
, которое:
- замените любую прямую ссылку на этот объект в кеше на
null
- отфильтровать этот элемент в любом
[User]
списке в любом запросе
Но его не существует (пока)
Это может быть отличная идея, а может быть еще хуже (например, разбивается нумерация страниц)
По этому поводу ведется интересное обсуждение: https://github.com/apollographql/apollo-client/issues/899
Я был бы осторожен с этими обновлениями запросов вручную. Сначала это выглядит аппетитно, но не будет, если ваше приложение будет расти. По крайней мере, создайте твердый слой абстракции поверх него, например:
- рядом с каждым определяемым вами запросом (например, в том же файле) - определите функцию, которая правильно его очищает, например
const MY_QUERY = gql``;
// it's local 'cleaner' - relatively easy to maintain as you can require proper cleaner updates during code review when query will change
export function removeUserFromMyQuery(apolloClient, userId) {
// clean here
}
а затем соберите все эти обновления и вызовите их все в финальном обновлении.
function handleUserDeleted(userId, client) {
removeUserFromMyQuery(userId, client)
removeUserFromSearchQuery(userId, client)
removeIdFrom20MoreQueries(userId, client)
}
person
Adam Pietrasiak
schedule
15.04.2019