Как установить переменную @client в результатах вложенного запроса на основе индекса элемента - PullRequest
1 голос
/ 10 февраля 2020

Ниже приведен запрос, который выбирает список продуктов и сохраняет его в локальном кэше apollo-client. Он извлекает список products и список images для каждого продукта

const GET_PRODUCTS_QUERY = gql`
  query Products($cursor: String, $query: String, $imageCount: Int = 100) {
    products(first: 9, after: $cursor, query: $query) {
      edges {
        cursor
        node {
          id
          selected @client
          title
          description
          images(first: $imageCount) {
            edges {
              node {
                id
                originalSrc
                selected @client
              }
            }
          }
        }
      }
    }
  }
`;

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

(_root, variables, { getCacheKey, cache }) => {
  const id = getCacheKey({
    __typename: "Product",
    id: variables.id
  });
  const fragment = gql`
    fragment toggleSelected on Product {
      selected,
    }
  `;
  const data = cache.readFragment({
    id,
    fragment
  });
  cache.writeData({
    id,
    data: {
      ...data,
      selected: !data.selected
    }
  });

Вышеуказанная мутация работает нормально, и в соответствующем product в кэше появляется флаг selected. Теперь у меня есть требование, чтобы при выборе продукта его первое изображение также отмечалось как выбранное без каких-либо действий со стороны пользователя. В этом случае у меня нет идентификатора изображения со мной. Я просто знаю, что каким бы ни было первое изображение выбранного товара, оно должно быть помечено как выбранное. Как я могу go добиться этого? Если бы у меня был идентификатор, думаю, я смогу создать фрагмент объекта Image и его мутировать.

...