根据文档的建议,我目前正在尝试将Apollo缓存系统用作我的应用程序的单一事实来源。我所做的第一次尝试是存储一些我可以更新并通过(伪)GraphQL查询获得的地图数据,这些数据将到达缓存而不是后端服务器。
这是我的resolvers.js
文件的样子:
export const defaults = {
MapState: {
__typename: 'MapState',
activable: false,
activeZones: [],
clickableZones: [],
},
};
export const resolvers = {
Mutation: {
updateMapState: (_, parameters, { cache, client }) => {
const query = gql`
query GetMapState {
MapState @client {
activable
activeZones
clickableZones
}
}
`;
let data = client.readQuery({ query });
if (parameters.activable) {
data.MapState.activable = parameters.activable;
}
if (parameters.activeZones) {
data.MapState.activeZones = parameters.activeZones;
}
if (parameters.clickableZones) {
data.MapState.clickableZones = parameters.clickableZones;
}
client.writeQuery({ query, data });
return null;
},
}
};
export const typeDefs = gql`
type MapState {
activable: Boolean!
activeZones: [String!]!
clickableZones: [String!]!
}
...
`;
这是我要更新的电话:
ApolloClient.mutate({
variables: {
activable: activable,
activeZones: activeZones,
clickableZones: clickableZones,
},
mutation: UPDATE_MAP_STATE,
refetchQueries: ['GetMapState'],
});
地图状态数据没有(也不应)具有关联的id
。因此,默认情况下,Apollo无法更新获取地图状态数据的组件-这是我的Map
组件通过名为GetMapState
的查询的情况。
在这种情况下,the documentation indicates refetchQueries
should be used。
所以,这可行。当我使用updateMapState
时,缓存确实已更新。 refetchQueries
确实从Apollo缓存中获取了地图状态的内容。 但是(这就是难点),在updateMapState
之后和refetchQueries
之前,以某种方式通过调用{{1 }},使用默认值时,我无法进行跟踪。
知道为什么要打这个电话吗?我该如何解决?似乎是一个非常简单的问题,但是我对堆栈的经验不足,无法让我了解正在发生的事情。
在InMemoryCache.write
中使用client
或cache
会得到相同的结果。
如果我删除resolver.js
,则表明缓存处于所需的状态,但是不会自动重新加载组件。如果添加它,则将重新加载该组件,但是我的缓存将被覆盖。
编辑:未启用refetchQueries
时,这就是我在缓存中保留的内容(仅显示了有趣的部分):
refetchQueries
没有密钥ROOT_QUERY
MapState: MapState
activable: false
activeZones: {"type":"json","json":["COUNTRY"]}
clickableZones: {"type":"json","json":[]}
ROOT_MUTATION
updateMapState({"activable":false,"activeZones":["COUNTRY"],"clickableZones":[]}): null