Как обработать удаление мутаций с оптимистичным пользовательским интерфейсом в 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 будет согласован.

Другие вопросы по тегам