Apollo 客户端递归突变

Posted

技术标签:

【中文标题】Apollo 客户端递归突变【英文标题】:Apollo client recursive mutations 【发布时间】:2017-09-06 15:57:48 【问题描述】:

下面的例子可以用 apollo-client 吗?

例如一个简单的 ToDo 应用程序和糟糕的互联网连接:

    没有互联网连接 (1.突变)创建一个新的待办事项 (1. mutation => 乐观更新) 显示新的 todo (local tmp-ID) (2. 突变)检查新的待办事项是否已完成(使用 tmp-ID) (2. 变异 => 乐观更新)显示待办事项已完成 现在已连接到服务器 ???

Apollo 客户端能否将 tmp-ID 替换为正确的待办事项,或者我该如何手动完成?

【问题讨论】:

【参考方案1】:

你可以试试这个,但我认为你不能在你的服务器上保留 true 的完成状态,因为你正在发送一个带有临时 id 的 completeTodo 突变。现在,您的服务器可以知道您正在引用哪个待办事项。虽然这可能会给你两个乐观的更新。

const CREATE_TODO_MUTATION = gql`
  mutation createTodo($todoContent: String!) 
    createTodo(todoContent: $todoContent) 
      id
      createdAt
      content
      completed
    
  
`;

const COMPLETE_TODO_MUTATION = gql`
  mutation completeTodo($id: String!) 
    completeTodo(id: $id) 
      id
      createdAt
      content
      completed
    
  
`;

const TodosPageWithMutations = compose(
  graphql(CREATE_TODO_MUTATION, 
    props: ( ownProps, mutate ) => (
      createTodo: content => mutate(
        variables:  todoContent: content ,
        optimisticResponse: 
          __typename: 'Mutation',
          createTodo: 
            __typename: 'Todo',
            id: createTempID(),
            content,
            completed: false,
            createdAt: new Date()
          
        
      ),
    ),
  ),
  graphql(COMPLETE_TODO_MUTATION, 
    props: ( ownProps, mutate ) => (
      completeTodo: todo => mutate(
        variables:  id: todo.id ,
        optimisticResponse: 
          __typename: 'Mutation',
          completeTodo: 
            __typename: 'Todo',
            id: todo.id,
            content: todo.content,
            completed: true,
            createdAt: todo.createdAt
          
        
      ),
    ),
  )
)(TodosPage);

【讨论】:

以上是关于Apollo 客户端递归突变的主要内容,如果未能解决你的问题,请参考以下文章

使用突变响应更新 apollo 客户端

突变后 React Apollo 客户端道具 refetchQueries

创建突变后添加到 Apollo 客户端缓存中的数组

Apollo 客户端突变错误和更新组件

React Apollo 客户端多个突变

如何在 GraphQL Apollo 客户端中处理异步突变