代码之家  ›  专栏  ›  技术社区  ›  MitchEff

每次删除都需要单独的突变吗?

  •  0
  • MitchEff  · 技术社区  · 6 年前

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

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

    在Apollo中,我需要选择一个引用此对象的查询,并在 update 功能,对吗?就像我在删除一个 Person 我需要找到一些随机查询,包括 Persons 用这个?

    如果只有一个查询 一切 ,然后从那里移除对象?或者我可以把它从阿波罗将一切正常化的地方移走吗?

    我认为有一个 GET_EVERYTHING 查询中包含每个实体,但另一个听起来像是一个巨大的混乱。

    1 回复  |  直到 6 年前
        1
  •  0
  •   Mikael Lirbank    6 年前

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

    如果您希望能够删除具有单个突变的任何类型的对象,也可以有一个DeleteNode突变。然后,您应该使所有可删除的类型继承自一个节点类型,并确保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
    }
    

    希望这有帮助!