Как обрабатывать удаление в Vue Apollo с глубоко вложенными запросами?

У меня есть запрос, который возвращает несколько вложенных объектов для отображения экрана, полного информации. Я хочу удалить один из глубоко вложенных объектов и оптимистично обновить экран (т. Е. Без выполнения полного запроса).

Чтобы объяснить запрос и пользовательский интерфейс, я буду использовать в качестве примера запрос, похожий на доску Trello:

query everything {
  getBoard(id: "foo") {
    name
    cardLists {        
      edges {
        node {
          id
          name
          cards {
            edges {
              node {
                id
                name
              }
            }
          }
        }
      }
    }
  }
}

Результат этого запроса используется для создания такого пользовательского интерфейса: https://d3uepj124s5rcx.cloudfront.net/items/170a0V1j0u0S2p1l290I/Board.png

Я создаю приложение, используя:

  • VueJS
  • Vue Apollo
  • Scaphold.io как мой магазин GraphQL

Когда я хочу удалить одну из карточек, я звоню:

deleteCard: function () {
  this.$apollo.mutate({
    mutation: gql`
      mutation deleteCard($card: DeleteCardInput!) {
        deleteCard(input: $card) {
          changedCard {
            id
          }
        }
      }
    `,
    variables: {
      'card': {
        id: this.id
      }
    },
  })
  .then(data => {
    // Success
  })
}

Мутация успешно удаляет карту, но я хочу немедленно обновить пользовательский интерфейс на основе мутации. Самый простой вариант сделать это - вызвать refetchQueries: ['everything'], но это дорогостоящий запрос и слишком медленный для быстрого обновления пользовательского интерфейса.

Я хочу оптимистично обновить пользовательский интерфейс, но пример мутаций для Vue Apollo don Не обращаются ни к удалению, ни к глубоко вложенному сценарию.

Какое решение / лучшие практики для удаления элемента из глубоко вложенного запроса и оптимистичного обновления пользовательского интерфейса?


person Jonathan Heron    schedule 14.03.2017    source источник
comment
Как обновить запрос после мутации, используя свойство updateQueries или dataIdFromObject клиента apollo?   -  person Locco0_0    schedule 14.03.2017
comment
@ Locco0_0 - Я использую updateQueries. Могу ли я использовать dataIdFromObject для непосредственного удаления этого объекта из магазина вместо обновления запроса?   -  person Jonathan Heron    schedule 14.03.2017
comment
Да, если вы добавите более глубокую вложенность к возвращаемому значению мутации, например добавьте идентификатор cardLists и в них карты. Но, конечно, медленнее.   -  person Locco0_0    schedule 14.03.2017


Ответы (1)


Если вы посмотрите документацию для оптимистического ответа apollo, вы увидите что оптимистичный ответ «подделывает» результат мутации.

Таким образом, он будет обрабатывать функцию updateQueries с оптимистическими значениями. В вашем случае это означает, что если вы добавите свойство optimisticResponse, оно должно изменить запрос внутри хранилища apollo с оптимистическими значениями:

Это могло выглядеть так:

this.$apollo.mutate({
  mutation: gql `
      mutation deleteCard($card: DeleteCardInput!) {
        deleteCard(input: $card) {
          changedCard {
            id
          }
        }
      }
    `,
  variables: {
    'card': {
      id: this.id
    }
  },
  updateQueries: {
    // .... update Board
  },
  optimisticResponse: {
    __typename: 'Mutation',
    deleteCard: {
      __typename: 'Card', // graphQL type of the card
      id: this.id,
    },
  },
})

person Locco0_0    schedule 14.03.2017
comment
Спасибо. Однако мне неясно, как написать updateQueries, чтобы я мог очень эффективно удалить соответствующий узел из существующего запроса, вместо того, чтобы повторно запрашивать всю доску снова, что медленно. - person Jonathan Heron; 14.03.2017
comment
Я понимаю. Тогда вы можете найти reacts неизменяемость помощника. Затем вам нужно найти правильный элемент внутри вашего глубоко вложенного запроса. Выглядит круто - person Locco0_0; 14.03.2017
comment
Спасибо за указатель, проверю. Я использую Vue, но чтение помощника по обеспечению неизменяемости React может помочь мне проинформировать меня. - person Jonathan Heron; 14.03.2017
comment
Тем временем я понял, что могу легко загрузить родительский список (и его дочерние карты) в запрос на мутацию, чтобы Apollo автоматически обновлял пользовательский интерфейс. Это все еще слишком затратный запрос, но лучше, чем перезагружать всю доску. - person Jonathan Heron; 14.03.2017
comment
Да, я думаю, это слишком дорого, чтобы загрузить столько дерева. Но, как вы сказали, лучше, чем перерисовывать всю плату. - person Locco0_0; 14.03.2017