Итак, я создаю приложение React / Apollo и немного зацикливаюсь на удалении вещей.
В моем приложении Redux мое действие «удалить» просто передает тип и идентификатор объекта моему редуктору, где я удаляю объект из своего нормализованного состояния. Таким образом, я могу использовать одно и то же действие / компонент / редуктор «удалить» для всех объектов. Аккуратный!
В Apollo мне нужно выбрать один запрос, который ссылается на этот объект, и прочитать / записать его в функции update, верно? Например, если бы я удалял Person, мне нужно было бы найти какой-нибудь случайный запрос, который включает Persons, и использовать его?
Будет ли плохой практикой иметь только один запрос, который получает все, а затем удалять объект оттуда? Или я могу просто удалить его откуда Аполлон все нормализует?
Я думаю, что это как бы побеждает цель GraphQL иметь запрос GET_EVERYTHING, в котором есть все сущности, но альтернатива просто звучит как огромный беспорядок.





Обычно у вас есть одна мутация удаления для каждого типа / узла. Например. deleteUser, deleteBook, deleteMessage и т. д. Входными данными для этих мутаций обычно будет идентификатор или список идентификаторов, если вы хотите иметь возможность удалить несколько записей одновременно.
У вас также может быть мутация deleteNode, если вы хотите иметь возможность удалять любой тип объекта с одной мутацией. Затем вы должны сделать все удаляемые типы унаследованными от типа узла - и убедиться, что идентификаторы действительно уникальны для всех типов.
Пример с мутациями удаления для каждой сущности и с общим удалением по узлу:
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
}
Надеюсь это поможет!
Да, я думаю, что в случае с Аполлоном имеет смысл задать для всех разные запросы. Ура, Микаэль!