Как обработать удаление мутаций с оптимистичным пользовательским интерфейсом в Apollo?
https://www.apollographql.com/docs/react/api/react-apollo.html
Есть много документации и учебных пособий, показывающих использование мутации update
а также optimisticResponse
свойства, связанные с добавлением вещей, но я не видел каких-либо связанных удалений.
Я не совсем уверен, как этот код должен выглядеть. Создав мутацию, вы хотите добавить новый элемент в кеш Apollo через update
и добавить временную копию в пользовательский интерфейс, используя optimisticResponse
, Но с удалением не имеет смысла "показывать" удаление, так как это отсутствие данных.
Это то, что у меня есть в методе в моем компоненте Vue, что отчасти правильно:
async handleDelete(trackId: number) {
const result = await this.$apollo.mutate({
mutation: require('@/graphql/delete-tracks.gql'),
variables: {
ids: [trackId],
},
update: store => {
const data: { getTracks: TrackList } | null = store.readQuery({
query: getTracksQuery,
variables: this.queryVars,
});
if (data && data.getTracks) {
data.getTracks.data = data.getTracks.data.filter(
(track: Track) => track.id !== trackId
);
--data.getTracks.total;
}
store.writeQuery({
query: getTracksQuery,
variables: this.queryVars,
data,
});
},
optimisticResponse: {},
});
console.log('result:', result);
},
Я понял, что мне в основном нужно удалить удаленный элемент из кэша Apollo, и эта часть, кажется, прекрасно работает. Хотя визуальное удаление происходит не сразу, так как optimisticResponse
, Это та часть, о которой я понятия не имею, как писать.
1 ответ
Понял, это было намного проще, чем я думал. Я просто не совсем понял, как optimisticResponse
вступил в игру с update
,
optimisticResponse: {
__typename: 'Mutation',
deleteTracks: [trackId],
},
Итак update
метод будет принимать этот результат из optimisticResponse
и удалить этот идентификатор дорожки из кэша. update
будет вызван второй раз с ответом сервера GraphQL, и кеш Apollo будет согласован.