Apollo 可以从缓存中读取部分片段吗?

Posted

技术标签:

【中文标题】Apollo 可以从缓存中读取部分片段吗?【英文标题】:Can Apollo read partial fragments from cache? 【发布时间】:2021-05-27 05:01:22 【问题描述】:

我有一个简单的突变editPerson。它会更改id 指定的人的姓名和/或描述。

我使用这个小 sn-p 从 React 组件中调用 mutator:

function useEditPerson(variables) 
    const gqlClient = useGQLClient();
    const personFragment = gql`fragment useEditPerson__person on Person 
        id
        name
        description
    `;

    return useMutation(gql`
        $personFragment

        mutation editPerson($id: ID!, $description: String, $name: String) 
            editPerson(id: $id, description: $description, name: $name) 
                ...useEditPerson__person
            
        
    `, 
        variables,
        optimisticResponse: vars => 
            const person = gqlClient.readFragment(
                id: vars.id,
                fragment: personFragment,
            );

            return 
                editPerson: 
                    __typename: "Person",
                    description: "",
                    name: "",
                    ...person,
                    ...vars,
                ,
            ;
        ,
    );

除非指定人员的namedescription 尚未被查询且缓存中不存在,否则此方法运行良好;在这种情况下,personnull。这是readFragment 所期望的 - 任何不完整的片段都会这样做。

问题是我真的需要这些数据来避免不变的错误 - 如果它们不在缓存中,我完全可以使用空字符串作为默认值,这些值无论如何都不会显示在 UI 中的任何位置。

有没有办法从缓存中读取部分片段?有没有更好的方法来获取乐观响应的数据?

【问题讨论】:

hmmm,console.log(并显示)所有这些personvarsvariables,准备好乐观(待返回)对象???为什么是id: variables.id,而不是id: vars.id @xadm ha - 这是一个很好的收获。这是我的代码的超级配对版本(为了 Stack Overflow)。我的实际代码使用vars.id 【参考方案1】:

我猜您使用的 sn-p 格式包含您需要的所有数据。因此,您可以通过参数将所需的数据传递给您的 useEditPerson 钩子,然后在乐观响应中使用,然后您就不需要使用 gqlClient。

【讨论】:

我想这会起作用,但数据不能来自 Apollo 有点令人失望。我真的很想让我的 mutator 函数成为小黑盒子——但是,嗯,必须做你必须做的。

以上是关于Apollo 可以从缓存中读取部分片段吗?的主要内容,如果未能解决你的问题,请参考以下文章

禁用从 apollo-boost 导出的 ApolloClient 中的缓存

从 apollo 缓存读取查询,查询尚不存在,但所有信息都已存储在缓存中

Apollo 客户端 - 从缓存中读取

只需从 Apollo 缓存中查看/读取值

如何通过 ID 从 Apollo 缓存中读取嵌套对象?

从缓存graphql apollo 2.0读取数据