Reactjs 为什么更新React Relay和Apollo Client中的本地缓存需要更新程序/更新功能?

Reactjs 为什么更新React Relay和Apollo Client中的本地缓存需要更新程序/更新功能?,reactjs,graphql,apollo,relaymodern,Reactjs,Graphql,Apollo,Relaymodern,我正在考虑使用React继电器或阿波罗客户端。我喜欢GraphQL作为一种查询语言的想法,它可以针对任何API或数据存储执行 然而,我感到惊讶的是,在一个简单的变化之后,比如在列表中添加一个todo项,需要手动(并且必须)更新存储/缓存。以下是更新程序/更新功能的文档: 为什么需要用户定义的更新程序函数 具体来说,为什么我必须编写更新程序函数来处理按顺序运行这两个GraphQL查询 //Create todo item mutation createTodo($input: TodoInpu

我正在考虑使用React继电器或阿波罗客户端。我喜欢GraphQL作为一种查询语言的想法,它可以针对任何API或数据存储执行

然而,我感到惊讶的是,在一个简单的变化之后,比如在列表中添加一个todo项,需要手动(并且必须)更新存储/缓存。以下是更新程序/更新功能的文档:

为什么需要用户定义的更新程序函数

具体来说,为什么我必须编写更新程序函数来处理按顺序运行这两个GraphQL查询

//Create todo item
mutation createTodo($input: TodoInput!) {
    createTodo(input: $input) {
        id
        name
        desc
    }
}

mutationVariables = { input: { name: 'Shopping', desc: 'Get groceries' }};


//Select all todos
query {
    todos {
        id
        name
        desc
    }
}  

为什么todo查询不会自动返回新的todo项?这就是声明性查询语言IMO的要点。

更新本地缓存背后的想法是最小化客户端和服务器之间传递的数据量

手动更新本地缓存完全取决于您。你完全可以编程你的变异来返回新的或所有的todo,然后它会更新你的本地缓存。(这将比手动更新慢,因为您需要等待响应。)手动更新与等待服务器响应有一些很好的用例


使用apollo,您还可以关闭本地缓存,只使用“仅网络”作为获取策略

暂时忘记乐观与悲观的更新。突变后的查询应该自动返回新的todo,而不管响应是否正确?即使这意味着查询是异步的,必须先转到服务器。应该是的,您可以使用refetch查询设置您的突变,以便在突变后自动运行查询。我已经在上述突变后运行查询。你是说我需要声明另一个查询:一个“refetch”查询吗?这只是重新蚀刻新的“todo”的另一种方式阅读下面的示例: