Apollo查询在我的应用程序的缓存中有错误的数据。
如果我将查询的fetchPolicy设置为“仅限网络”,则一切正常。
所以我认为这是一个缓存问题。
我一直在努力解决该问题,并查看有关阿波罗缓存的文章,但仍然无法解决问题。
以下是我查询后的结果:
参数memberId为null(结果正确)
[
{
"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标签(其他数据)包装内容
,它的参数也是memberId。
像这样的结构
<Query
variables={{ memberId: options.memberId || null }}
query={FETCH_MEMBER_LIST_QUERY}>
content that use orderGroupShipmentList and memberList
</Query>
我不知道这是否足够具体
让我知道这是否不够具体
谢谢
答案 0 :(得分:0)
@Anymore-我们可以看到您的FETCH_MEMBER_LIST_QUERY代码吗?您是否正在获取所有数据的ID?没有ID,就无法匹配关系。
您是否尝试过使用Apollo Client DevTools-它们将使您轻松查看缓存的内容。可以在GitHub here和Chrome Webstore here
上找到使用此方法,您将能够查看该项目是否被正确缓存。
答案 1 :(得分:0)
您需要为查询的返回结果提供不同的ID。例如,对于基于id的id 87,您具有不同的结果,因此第二个查询将覆盖缓存,并且由于apollo不会重新获取默认情况下已经进行的查询,因此它将继续查看覆盖的结果。