Итак, у меня есть форма в моем приложении React Apollo, которая либо добавляет, либо обновляет пользователя. При получении данных, если пользователь существует, Apollo знает об этом и правильно объединяет / нормализует данные.
Если это не так, он ничего не делает, и мне нужно вручную добавить его так:
const result = await this.props.upsertPersonMutation({
variables: {
...this.state.fields,
},
update: (store, { data }) => {
// somewhere in here I'll need to check if it's new or not
const initDataQuery = store.readQuery({query: INIT_DATA});
const { upsertPersonMutation } = data;
initDataQuery.getInitData.user.people.push(upsertPersonMutation)
store.writeQuery({query: INIT_DATA, data: initDataQuery})
}
}).then(response => {
this.setState({
isLoading: false
});
this.props.closeCallback();
})
Хотя я впечатлен, что он может делать первое, почему он не может добавлять новые записи в массив? Я чувствую, что, возможно, это побеждает цель, если решает только половину проблемы, понимаете?


Это происходит потому, что после выполнения мутации клиент apollo проверяет, есть ли в кэше apollo какой-либо элемент с таким же ключом идентификатора. Если есть, он обновляется автоматически. Аполлон называет эти обновления Автоматические обновления кеша.
Если в кеше нет ничего, что соответствует результату мутации, клиент apollo не добавит его. Мутации используются явно для изменения объектов и запросов для их извлечения. Использование функции update - это способ добавить ее через мутацию.
По умолчанию ключ идентификатора - <__typename>:<id>, <__typename>:<_id> или путь, по которому был осуществлен доступ к объекту. Прочтите эту ссылку, чтобы узнать больше о как Apollo нормализует кеш.
Фантастический ответ, Педро. Большое спасибо за это