突变后的Apollo客户端更新无法映射原始结果?

时间:2017-04-23 06:44:31

标签: reactjs graphql apollo react-apollo apollo-client

所以基本上我想在突变后更新我的用户界面,但这确实是一种痛苦,现在已经停滞了几天。

我的一些组件依赖于我的根查询,并映射结果。

每当我创建一个新资源并更新我的根查询时,原始结果就不再被加载,这会导致can't read property map of undefined,因为结果不再存在。添加一个检查什么都不做,它只是永远加载。

这是我的突变:

export const withCreateLink = graphql(createLink, {
// Mutate normally gets passed as prop to wrapped component
props({ownProps, mutate}) {
    return {
        // But for updating the store we're actually hijacking mutate to a custom function        
        createLink(url, description, group) {
            return mutate({
                variables: {
                    url,
                    description,
                    group
                },
                optimisticResponse: {
                    createLink: {
                        __typename: 'Link',
                        id: -1,
                        url,
                        description,
                        group: {
                            id: group
                        }
                    }
                },
                update: (proxy, mutationResult) => {
                    const query = getAllGroups;
                    const data = proxy.readQuery({query});

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

                    proxy.writeQuery({
                        query,
                        data
                    })
                }
            })
        }
    }
}
});

我只是想通过仅刷新我的资源添加到的组来更新我的UI。有人可以帮帮我吗?

1 个答案:

答案 0 :(得分:0)

转换dataIdFromObject以检查typename可以解决问题:

dataIdFromObject: (result) => {
    if (result.id && result.__typename) {
        return result.__typename + ':' + result.id;
    }
    return null;
}

我想我只是使用Id就无法写入缓存。这显然是默认提案。