代码之家  ›  专栏  ›  技术社区  ›  MitchEff

阿波罗是如何聪明到知道什么时候合并,但不补充?

  •  0
  • MitchEff  · 技术社区  · 7 年前

    所以我的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 回复  |  直到 7 年前
        1
  •  1
  •   Pedro Baptista Afonso    7 年前

    发生这种情况的原因是,在执行了一次变异之后,Apollo客户机检查Apollo缓存中是否有任何具有相同标识符密钥的项。如果有,它会自动更新。Apollo调用这些更新 Automatic Cache Updates .

    如果缓存中没有与变异结果匹配的内容,Apollo客户机将不会添加它。突变被显式地用来改变对象和查询来获取它们。使用 update 函数是通过突变来添加它的方法。

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