【问题标题】:Do I need a separate mutation for every delete?每次删除都需要单独的突变吗?
【发布时间】:2019-01-03 00:00:45
【问题描述】:

所以我正在构建一个 React/Apollo 应用程序,但我有点卡在删除东西上。

在我的 Redux 应用程序中,我的“删除”操作只是将对象类型和 ID 传递给我的 reducer,在那里我将对象从标准化状态中删除。这样,我可以对所有对象使用相同的“删除”动作/组件/reducer。整洁!

在 Apollo 中,我需要选择一个引用该对象的查询,并在 update 函数中对其进行读/写,对吗?就像我要删除 Person 一样,我需要找到一些包含 Persons 的随机查询并使用它?

只用一个查询获取所有内容,然后从那里删除对象是不是不好?或者我可以将它从 Apollo 将所有内容正常化的任何地方删除吗?

我认为拥有一个包含所有实体的GET_EVERYTHING 查询有点违背了 GraphQL 的目的,但替代方案听起来就像是一团糟。

【问题讨论】:

    标签: reactjs graphql apollo react-apollo


    【解决方案1】:

    通常每个类型/节点都有一个删除突变。例如。 deleteUser、deleteBook、deleteMessage 等。如果您希望能够一次删除多个条目,这些突变的输入通常是一个 ID 或一个 ID 列表。

    如果您希望能够通过单个突变删除任何类型的对象,您也可以使用 deleteNode 突变。然后,您应该让所有可删除类型都继承自 Node 类型 - 并确保 ID 在所有类型之间真正唯一。

    每个实体都删除突变和按节点进行一般删除的示例:

    interface Node {
      id: ID!
    }
    
    type Person implements Node {
      id: ID!
      firstName: String!
      lastName: String!
    }
    
    type Book implements Node {
      id: ID!
      title: String!
      author: String!
    }
    
    union NodeEntity = Person | Book
    
    type Query {
      person(id: ID!): Person
      persons: [Person!]! # You may want to limit the number of returned items
    
      # ... same thing for Book
    
      node(id: ID!): Node
      nodes: [Node!]! # You may want to limit the number of returned items
    }
    
    type Mutation {
      createPerson(input: CreatePersonInput!): CreatePersonPayload!
      updatePerson(input: UpdatePersonInput!): UpdatePersonPayload!
      deletePerson(input: DeletePersonInput!): DeletePersonPayload!
    
      # ... same thing for Book
    
      deleteNode(input: DeleteNodeInput!): DeleteNodePayload!
    
      # or simply:
      # deleteNode(id: String!): Boolean!
    }
    
    # Mutation inputs
    input CreatePersonInput {
      firstName: String!
      lastName: String!
    }
    
    input UpdatePersonInput {
      personId: ID!
      firstName: String
      lastName: String
    }
    
    input DeletePersonInput {
      personId: ID!
    }
    
    input DeleteNodeInput {
      nodeId: ID!
    }
    
    # Mutation results
    type CreatePersonPayload {
      person: Person!
    }
    
    type UpdatePersonPayload {
      person: Person!
    }
    
    type DeletePersonPayload {
      person: Person!
    }
    
    type DeleteNodePayload {
      node: NodeEntity!
    
      # or simply:
      # node: Node
    }
    

    希望这会有所帮助!

    【讨论】:

    • 是的,我认为在 Apollo 的情况下,对所有这些都进行不同的查询可能是最有意义的。干杯迈凯尔!
    猜你喜欢
    • 1970-01-01
    • 2021-02-24
    • 2016-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-10
    相关资源
    最近更新 更多