Запрос Apollo содержит неверные данные из кэша - PullRequest
0 голосов
/ 10 февраля 2019

В запросе Apollo неверные данные из кэша в моем приложении реакции.

Если я установлю для fetchPolicy запроса значение «только для сети», все будет работать правильно.

Так что я думаю, что это. кэш проблема

1006 * Я работал изо всех сил стараются решить эту проблему и увидеть статьи о APOLLO кэше, но я до сих пор не может решить проблему 1008 * Вот мои результаты после запроса: *.1009 *

параметр memberId равен нулю (результат верен)

[
  {
    "id": 87,
    "totalQuantity": 12,
    "Orders": [
      {
        "id": 1,
        "quantity": 11,
        "Member": {
          "id": 1,
          "name": "A"
        }
      },
      {
        "id": 28,
        "quantity": 1,
        "Member": {
          "id": 9,
          "name": "B"
        }
      }
    ]
  },
  {
    "id": 88,
    "totalQuantity": 1,
    "Orders": [
      {
        "id": 2,
        "quantity": 1,
        "Member": {
          "id": 1,
          "name": "A"
        }
      }
    ]
  }
]

параметр memberId равен 9 (результат верен)

[
  {
    "id": 87,
    "totalQuantity": 1,
    "Orders": [
      {
        "id": 28,
        "quantity": 1,
        "Member": {
          "id": 9,
          "name": "B"
        }
      }
    ]
  }
]

параметр memberId равен 1 (результат верен)

[
  {
    "id": 87,
    "totalQuantity": 11,
    "Orders": [
      {
        "id": 1,
        "quantity": 11,
        "Member": {
          "id": 1,
          "name": "A"
        }
      }
    ]
  },
  {
    "id": 88,
    "totalQuantity": 1,
    "Orders": [
      {
        "id": 2,
        "quantity": 1,
        "Member": {
          "id": 1,
          "name": "A"
        }
      }
    ]
  }
]

но когда я возвращаюсь к параметру null, результат неправильный

[
  {
    "id": 87,
    "totalQuantity": 11,
    "Orders": [
      {
        "id": 1,
        "quantity": 11,
        "Member": {
          "id": 1,
          "name": "A"
        }
      }
    ]
  },
  {
    "id": 88,
    "totalQuantity": 1,
    "Orders": [
      {
        "id": 2,
        "quantity": 1,
        "Member": {
          "id": 1,
          "name": "A"
        }
      }
    ]
  }
]

Член B (id = 9) исчезает ..

и я возвращаюсьдля параметра 9 (результат неверный)

[
  {
    "id": 87,
    "totalQuantity": 11,
    "Orders": [
      {
        "id": 1,
        "quantity": 11,
        "Member": {
          "id": 1,
          "name": "A"
        }
      }
    ]
  }
]

Я получаю данные члена A вместо члена B

Может ли кто-нибудь мне помочь?Спасибо


Моя клиентская конфигурация (кэш-память InMemoryCache)

const client = new ApolloClient({
  link: ApolloLink.from([
    httpLink,
  ]),
  cache,
  dataIdFromObject: o => ${o.id}${o.__typename},
});

Я использую queryHook, чтобы обернуть свой компонент

const queryHook = graphql(FETCH_ORDER_GROUP_SHIPMENT_LIST, {
  options: ownProps => ({
  variables: {
    memberId: ownProps.options.memberId || null,
  },
}),
  props: ({
    data: {
      orderGroupShipmentList,
    },
  }) => ({
    orderGroupShipmentList: orderGroupShipmentList || [],
  });

Также я использую тег Query (другоеdata), чтобы обернуть мой контент

, а его параметр также memberId.

структура, подобная этой

<Query
  variables={{ memberId: options.memberId || null }}
  query={FETCH_MEMBER_LIST_QUERY}>
  content that use orderGroupShipmentList and memberList
</Query>

Я не знаю, достаточно ли это конкретно

Дайте мне знать, если это недостаточно конкретно

Спасибо

Ответы [ 2 ]

0 голосов
/ 23 мая 2019

Вы должны иметь разные идентификаторы для этого типа в возвращаемых результатах для вашего запроса.Например, у вас есть разные результаты для идентификатора 87 на основе memberId, поэтому кэш будет перезаписан вашим вторым запросом, и, поскольку apollo не перехватывает запросы, уже сделанные по умолчанию, он продолжит смотреть на перезаписанный результат.

0 голосов
/ 10 февраля 2019

@ Больше - мы увидим ваш код FETCH_MEMBER_LIST_QUERY?Вы выбираете идентификаторы для всех данных?Без идентификаторов он не сможет сопоставить отношения.

Вы пытались использовать Apollo Client DevTools - они позволят вам легко просматривать содержимое кэша.Его можно найти на GitHub здесь и в Интернет-магазине Chrome здесь

С помощью этого вы сможете увидеть, правильно ли кэшируется элемент.

...