为啥需要更新器/更新函数来更新 React Relay 和 Apollo 客户端中的本地缓存?
Posted
技术标签:
【中文标题】为啥需要更新器/更新函数来更新 React Relay 和 Apollo 客户端中的本地缓存?【英文标题】:Why is an updater/update function required to update the local cache in React Relay and Apollo Client?为什么需要更新器/更新函数来更新 React Relay 和 Apollo 客户端中的本地缓存? 【发布时间】:2019-02-11 01:12:10 【问题描述】:我正在考虑使用 React Relay 或 Apollo 客户端。我喜欢 GraphQL 作为一种可以针对任何 API 或数据存储执行的查询语言的想法。
但是,我很惊讶在简单的突变(例如将待办事项添加到列表中)后需要手动(并且强制地)更新存储/缓存。以下是更新程序/更新函数的文档:
http://facebook.github.io/relay/docs/en/mutations.html https://www.apollographql.com/docs/react/essentials/mutations.html
为什么需要用户定义的更新函数?
具体来说,为什么我必须编写一个更新函数来处理依次运行这两个 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
为什么 todos 查询不会自动返回新的 todo 项?这是声明式查询语言 IMO 的要点。
【问题讨论】:
【参考方案1】:更新本地缓存背后的想法是最大限度地减少客户端和服务器之间传递的数据量。
手动更新本地缓存完全取决于您。您绝对可以对您的突变进行编程以返回新的或所有待办事项,然后它将更新您的本地缓存。 (它会比手动更新慢,因为您需要等待响应。)手动更新与等待服务器响应有一些很好的用例
使用 apollo,您还可以关闭本地缓存并仅使用“仅限网络”作为您的获取策略。
【讨论】:
暂时忘记乐观与悲观的更新。不管响应如何,突变后的查询都应该自动返回新的待办事项,对吗?即使这意味着查询是异步的,并且必须先到服务器。 应该是的,您可以使用重新获取查询设置您的突变,以便在突变后自动运行查询。 我已经在上面的突变之后运行了一个查询。你是说我需要声明另一个查询:“refetch”查询? 这只是重新获取新“待办事项”的另一种方式,请在此处阅读此示例:github.com/apollographql/apollo-client/blob/master/docs/source/…以上是关于为啥需要更新器/更新函数来更新 React Relay 和 Apollo 客户端中的本地缓存?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 React setState hook 没有立即更新? [复制]
React Star Widget - 为啥所有星星都在单击时更新?