React + Apollo +缓存+ refetchQueries;突变后,缓存更新将被覆盖

时间:2019-07-02 13:54:10

标签: javascript reactjs graphql apollo react-apollo

根据文档的建议,我目前正在尝试将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中使用clientcache会得到相同的结果。

如果我删除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

0 个答案:

没有答案