Apollo 如何足够聪明地知道何时合并,但不知道何时添加?

Posted

技术标签:

【中文标题】Apollo 如何足够聪明地知道何时合并,但不知道何时添加?【英文标题】:How is Apollo clever enough to know when to merge, but not to add? 【发布时间】:2019-01-02 22:41:27 【问题描述】:

所以我的 React Apollo 应用程序上有一个表单,可以添加或更新用户。接收数据时,如果用户存在,Apollo 会知道并正确合并/规范化数据。

如果不是,它什么也不做,我需要像这样手动附加它:

        const result = await this.props.upsertPersonMutation(
            variables: 
                ...this.state.fields,
            ,
            update: (store,  data ) => 
                // somewhere in here I'll need to check if it's new or not
                const initDataQuery = store.readQuery(query: INIT_DATA);
                const  upsertPersonMutation  = data;

                initDataQuery.getInitData.user.people.push(upsertPersonMutation)
                store.writeQuery(query: INIT_DATA, data: initDataQuery)
            
        ).then(response => 
            this.setState(
                isLoading: false
            );

            this.props.closeCallback();
        )

虽然它能够做到前者给我留下了深刻的印象,但为什么它不能将新条目附加到数组中?我觉得如果它只解决了一半的问题,你知道吗?

【问题讨论】:

【参考方案1】:

这是因为在执行突变后,apollo 客户端会检查 apollo 缓存中是否有任何具有相同标识符键的项目。如果有,它会自动更新。阿波罗将这些更新称为Automatic Cache Updates。

如果缓存中没有与突变结果匹配的内容,apollo 客户端将不会添加它。突变被明确地用于改变对象和查询以获取它们。使用 update 函数是通过突变添加它的方法。

默认情况下,标识符键是<__typename>:<id><__typename>:<_id> 或访问对象的路径。阅读此链接以了解有关how Apollo normalizes the cache 的更多信息。

【讨论】:

完美的答案,佩德罗。非常感谢

以上是关于Apollo 如何足够聪明地知道何时合并,但不知道何时添加?的主要内容,如果未能解决你的问题,请参考以下文章

我如何知道何时可以安全地重用来自另一个进程的后台 NSURLSessionConfiguration id?

查找对象何时在雪花中掉落

node.js 进程如何知道何时停止?

何时使用 apollo-link-state 以及何时使用 apollo-cache-inmemory

如何找到 horneq 队列长度

桌面应用程序如何知道服务器上的数据何时可用?