Вопрос об отношениях родителя / ребенка и компонентах - PullRequest
0 голосов
/ 17 июня 2019

В настоящее время я пытаюсь перенести проект из vuex / REST в vue-apollo.Проект показывает список событий, и каждое событие может быть расширено, чтобы показать детали, включая участников.

Итак, у меня есть компонент EventList, который выбирает события и все атрибуты, необходимые для списка.И у меня есть EventDetails дочерний компонент, который раскрывается из списка по щелчку.EventDetails требует некоторые данные о событиях, а также список участников для рендеринга.Проблема в том, что я не могу найти элегантный способ построения запросов.

В настоящее время у меня есть один запрос для событий, который выполняется компонентом EventList:

query Events($type: [String!]) {
  events(type: $type) {
    id
    name
    attendeeCount
  }
}

ВнутриEventList компонент, я передаю идентификатор события дочернему компоненту EventDetails, который затем, в свою очередь, запрашивает у API посетителей:

query Event($id: ID!) {
  event(id: $id) {
    id
    name
    attendeeCount
    attendees {
      id
      name
      paymentState
    }
  }
}

Родительский компонент (упрощенно):

<template>
  <EventDetails v-for="event in events" :eventId="event.id" />
</template>

<script lang="ts">
import …

@Component({
  apollo: {
    events: { … }
  },
  components: {
    EventsDetails
  }
})
export default class EventList extends Vue {
  events: Event[] = []
}
</script>

Дочерний компонент (упрощенно):

export default class EventDetails extends Vue {
  @Prop(Number) eventId!: ID
  // I'd like to pass in the complete event object here, and just
  // fetch another attribute "attendees" via graphql, like this:
  @Prop(Object) event!: Event

  apollo: {
    // Passing in the event as prop conflicts with this.
    // How can I fetch more attributes for a passed in object?
    // Is this even possible? Do I have to fetch everything again?
    // Is it possible with vue-apollo to just fetch the attendees
    // and return them as property "attendees" in the EventDetails
    // component?
    event: {
      query: gql`
        query Event($id: ID!) {
          event(id: $id) {
            ...event
            attendees {
              id
              aasmState
              event {
                id
                attendeeSelectionClosed
              }
              ticket {
                id
                companyName
                position
              }
            }
          }
        }
        ${eventFragment}
      `,
      variables() {
        return { id: this.eventId }
      },
      error(error) {
        console.log(error)
      }
    }
  }
}

Проблема с этим подходом в том, что с запросом с именем event я не могу передать уже извлеченное событие как проп, поэтомуэти данные события должны быть извлечены снова.Кроме того, сведения о событии нельзя отобразить сразу после развертывания панели EventDetails (ожидание выполнения запроса).

Таким образом, есть способ передать данные события (не только идентификатор) и запросить только участниковчерез GraphQL?Единственное возможное решение, которое я нашел, это добавление еще одного запроса attendees на сервер GraphQL, которого я хотел бы избежать, потому что участники всегда группируются по событию, и мы всегда знаем родительский объект события.

Но считается ли это хорошей архитектурой на земле GraphQL?Добавить тип запроса для каждого типа объекта, с которым вы имеете дело, даже если всегда знаете родителя и работает с помощью родительского запроса?

Вполне возможно, что я пытаюсь сделать что-то глупое, яЯ все еще довольно новичок в архитектуре GraphQL.

Ваша помощь очень важна.

1 Ответ

0 голосов
/ 17 июня 2019

Так есть ли способ передать данные события (а не только идентификатор) и запросить только участников через GraphQL?

Нет, 'ask' в родительском запросе для частейнеобходимо сразу в списке / подробностях (например, имена участников).Каждое расширение родительского запроса - запрос суперсета создает новый запрос, не используя уже извлеченные данные (из кэша).Запросите более оперативный способ сохранения запросов.

Единственное возможное решение, которое я нашел, - это добавление еще одного посетителя запроса на сервер GraphQL, которого я хотел бы избежать, поскольку участники всегда группируются подсобытие, и мы всегда знаем родительский объект события.

В реакции (я не использую vue) вы можете передавать данные как реквизиты из родительского компонента - нет необходимости смешивать эти данные в запросеrequest .

Вы можете запросить attendees 'напрямую' (не * event), используя простой фильтр на attendees, например attendees (eventID:'some id') {.... - конечно, реализуется attendees resolver

...