所有项目的阿波罗客户端特定更新查询?

Apollo client specific updatequery for all items?

我有两个具有以下关系的模型:

Groups 有很多 链接

所以基本上我的初始查询是 getAllGroups,它获取所有组及其 link。 我有一个简单地创建 link 的突变,更新我的 UI 的最有效方法是什么?

目前我有:

export const withCreateLink = graphql(createLink, {
props({ownProps, mutate}) {
    return {
        createLink(url, description, group) {
            return mutate({
                variables: {
                    url,
                    description,
                    group
                },
                updateQueries: {
                    getAllGroups: (prev, {mutationResult}) => {
                        const newLink = mutationResult.data.createLink;
                        return update(prev, {
                            allGroups: {
                                links: {
                                    $push: [newLink]
                                }
                            }
                        })
                    }
                }
            })
        }
    }
}
});

基本上我只想获取添加了 link 的组,但我需要指定是哪个组。我该怎么做?

我已经弄清楚了,在以这种方式创建其他突变时,我发现了一些不同的方法来解决这个问题:

选项 1: 如果您有权访问缓存中当前模型的索引,则可以将其作为道具传递,然后在查询中使用它来定位已添加到的模型:

                updateQueries: {
                getAllGroups: (prev, {mutationResult}) => {
                    const newLink = mutationResult.data.createLink;
                    return update(prev, {
                        allGroups: {
                            [groupIndex]:
                              links: {
                                 $push: [newLink]
                              }
                        }
                    })
                }
            }

选项 2: 使用 update 而不是 updateQueries,因此您可以读取根查询的结果,对其进行映射,然后附加新插入的数据。之后就可以写入缓存了。

                    update: (proxy, mutationResult) => {
                    const query = getAllGroups;
                    const data = proxy.readQuery({query});

                    data.allGroups.map((groupData) => {
                        if(groupData.id == group)
                            groupData.links.push(mutationResult.data.createLink);
                    });

                    proxy.writeQuery({
                        query,
                        data
                    })
                }