Кэш нормализует данные из ответа, сохраняя только ссылки на объекты, возвращаемые сервером. Если поле разрешено для объекта, этот объект будет извлекаться и кэшироваться отдельно, а значение поля будет просто ссылкой на этот объект (т. Е. Ключ кэша, созданный путем объединения полей __typename
и id
). Если поле разрешено в список объектов, каждый объект в списке будет извлекаться и кэшироваться отдельно, а значение поля будет просто массивом ссылок на каждый объект.
Поскольку объекты кэшируются согласно вышеупомянутому ключу кэша, не имеет значения как запрос возвращает конкретный объект - если объект находится в ответе, он переопределит то, что уже находится в кэше. Любые родительские / дочерние отношения не имеют отношения к механизму. То же самое касается ручной записи в кеш.
Когда вы просто изменяете объект, который уже находится в кеше, ключ для сервера - возвращать мутированный объект где-то в своем ответе - до тех пор, пока это делает это, кэш будет обновляться, чтобы отразить любые изменения, которые были внесены в объект.
Что хитро, так это мутации, которые влияют на членство объекта в списке. Например, у вас может быть запрос, который возвращает список завершенных задач, и другой запрос, который возвращает список ожидающих задач. В кеше будет храниться массив ключей кеша для каждого запроса, соответствующего объектам дел. Если мутация изменяет статус дела с ожидающего на завершенное, Apollo не может знать, что ему нужно удалить его из одного запроса и добавить к другому (это бизнес-логика c, которую знает только ваш сервер ). В этом случае мы должны выполнить ручную запись в кэш и самостоятельно обновить запросы.
Тот же принцип применим к созданию или удалению задачи - Аполлон не может знать, "эта мутация создала задачу ", и даже если бы он это сделал, он не смог бы узнать, к каким спискам он должен быть добавлен.