首页 > 解决方案 > Apollo 如何足够聪明地知道何时合并,但不知道何时添加?

问题描述

所以我在我的 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();
        })

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

标签: graphqlapolloreact-apollographql-js

解决方案


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

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

默认情况下,标识符键是<__typename>:<id><__typename>:<_id>或访问对象的路径。阅读此链接以了解有关Apollo 如何规范化缓存的更多信息。


推荐阅读