@graphql_ru
GraphQL — русскоговорящее сообщество

Общаемся на темы, посвященные GraphQL и опыту его использования. Проблемы. Новости. Решения. Вам могут быть полезны: @apollo_ru, @react_js, @vuejs_ru Рекомендуем сразу отключить уведомления, чтобы пребывание в чате было полезным и комфортным.

352 members

Архив канала @graphql_ru 9 июня 2018 г.

08:27:35 ПП
User 202047214
Всем привет! Кто-нибудь наверняка с аполло возился, облазил кучу issue на гитхабе и нигде людям не ответили, хотя вроде вопрос вполне обычный.
Есть query списка сущностей, который принимает переменные с фильтрами (в моем случае дату). Есть мутация, которая добавляет новую сущность. В update мутации пытаюсь обновить кэш руками, но если у меня закешированы query для разных дат, то обновить их тоже нужно все, что руками не всегда возможно сделать. Есть какое-то стандартное решение этого?
В интернетах все или запрашивают списки без переменных, или дают советы типа сделать ресет всего кэша :)
08:28:56 ПП
User 224769697
сделай ресет всего кеша :)
08:29:21 ПП
08:29:36 ПП
User 296063066
если у меня закешированы query для разных дат, то обновить их тоже нужно все
а почему все?
08:29:39 ПП
User 224769697
а обновить только нужные квери не подойдет?
08:29:48 ПП
08:31:46 ПП
User 202047214
Можно взять конкретный пример - у меня меню с фильтром maxDate, там могут быть разные варианты maxDate заданы, которые фетчат сущности от текущего момента и до этой даты. Если я пройдусь по всем пунктам меню - они все закешируются. Если потом обновить только часть из них, то при переходе на остальные - данные будут прилетать из кэша без добавленной сущности
08:32:32 ПП
User 224769697
хм, а что если руками обновить только текущий фильтр, и поставить fetch-policy: network-only (как то так)
08:32:54 ПП
User 224769697
и у тебя при изменении фильтра данные будут браться не из кеша а фетчиться
08:40:05 ПП
User 202047214
Я вот думаю сейчас о трех вариантах: или как ты предлагаешь fetchPolicy менять (что в целом предполагает тогда, что просто при навигации туда сюда без мутаций - я буду фетчить данные постоянно), или забить и делать ресет стора, или поискать/сделать какой-то велосипед, который сможет автоматом почистить кэш для всех переменных сам
08:41:13 ПП
User 202047214
Но кейс реально кажется нужным чуть ли не для каждого приложения нормального, а по бестпрактисам тихо
08:43:47 ПП
User 202047214
Возможно стоит cache-and-network fetchPolicy просто юзать, а если что оптимизировать потом когда-нибудь)
08:44:07 ПП
User 296063066
@BananaBobby согласен что тема недостаточно проработана. Еще такая идея - когда юзер ходит по навигации/меняет фильтр, сохранять в стейте компонента варианты фильтра (даты). Потом в update можно в цикле пройтись по ним и обновить кэш.
08:45:23 ПП
User 202047214
У меня мутации отдельно от компонента лежат. Я этом плане тут немного навернул, так как не люблю все внутри компонентов хранить. Очень часто один и тот же код приходится из разных контекстов запускать. Если расшарю код - то могут и помидорами закидать, но пока очень удобно выходит)
08:46:50 ПП
User 202047214
Просто тут немного аполло с редаксом сплетены (аполло для данных, редакс для ui), так как есть места, где нужно сделать мутацию, а после нее закрыть модальное окно, например
08:47:09 ПП
User 296063066
ну ты же когда вызываешь мутацию передаешь ей variables? значит компонент знает о датах
08:48:39 ПП
User 202047214
Не совсем так, я делаю квери с датами, а мутации без них
08:48:50 ПП
User 202047214
И квери с мутациями делаются в разных компонентах
08:48:56 ПП
User 224769697
User 202047214
Просто тут немного аполло с редаксом сплетены (аполло для данных, редакс для ui), так как есть места, где нужно сделать мутацию, а после нее закрыть модальное окно, например
А apollo-link-state  пробовал?
08:49:02 ПП
User 296063066
ну да, я имел ввиду когда делаешь query
08:49:58 ПП
User 202047214
User 224769697
А apollo-link-state  пробовал?
Гляну, не смотрел :)
08:50:08 ПП
User 202047214
Примерно так мутация выглядит:
08:50:15 ПП
08:50:25 ПП
User 296063066
вообщем нужен клиентский state который будет хранить историю установленных фильтров, тогда ты будешь знать с какими параметрами вызывался query и что лежит в кэше
08:51:07 ПП
User 202047214
Ну я могу обновить кэш для текущего фильтра, но при переходе на другой - у меня возьмутся данные тоже из кеша, без новой сущности
08:52:08 ПП
User 202047214
А, пропустил про сохранение всех
08:52:32 ПП
User 202047214
В целом тоже решение, но я боюсь, что если обрастет такими вещами приложение, то потом не разгрести
08:53:01 ПП
User 296063066
я о том и говорю что обновлять надо будет в цикле весь кэш:
update = (cache, ...) => this.state.usedFilters.forEach(filter => cache.readQuery(variables: filter) ... cache.writeQuery(variables: filter) )
08:53:49 ПП
User 224769697
Может уже есть какие нибудь хелперы для обновления кеша при добавлении новых сущностей? Код то похож почти всегда
08:54:48 ПП
User 202047214
Вот я и ищу, удобно было бы если бы можно было просто query передать без переменных и аполло бы почистил для всех вариантов
09:39:55 ПП
User 202047214
К сожалению, остановился в итоге на resetStore :D