Сделать компонент запроса apollo многоразовым в React

Итак, я создаю компонент таблицы в своем проекте React, с помощью которого я отображаю список таких вещей, как Teams, Games, Players и т. д.

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

Дело в том, что я использую Apollo и GraphQL для извлечения этих данных из моей БД, и каждый запрос имеет другое имя данных: например. если я соберу все свои команды, у меня будет data.allTeams но если я соберу все свои игры, у меня будет data.allGames:

class SectionTable extends React.Component<SectionTableProps, {}> {
  constructor(props: SectionTableProps) {
    super(props);
  }
  render() {
    return (
          <SectionTableQuery query = {this.props.query} >
          {({ data: { allTeams = [] } = {}, error, loading }) => {
            if (loading) {
              return <tbody><tr><td>LOADING</td></tr></tbody>
            };
            if (error !== undefined) {
              return <tbody><tr><td>ERROR</td></tr></tbody>
            };
            return (
              <tbody>
                {allTeams.map((elem) => (
                    <tr key = {elem.id}>
                      <th scope = "row">{elem.id}</th>
                      {Object.keys(elem).map((k, i) => {
                        if (k !== "id" && k !== "__typename") {
                          return (<td key = {elem[k]}>{elem[k]}</td>)
                        }
                      })}
                    </tr>
                ))}
              </tbody>
            );
          }}
        </SectionTableQuery>
    )
  }
} 

В одном случае я захочу выполнить карту через allTeams, а в другом случае я захочу выполнить карту через allGames.

Как я могу изменить свой код, чтобы он мог принимать имя данных в качестве аргумента?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
0
148
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

может быть, просто отправить реквизит, чтобы указать, какой список зацикливается

class SectionTable extends React.Component<SectionTableProps, {}> {
  ...
  render() {
    const { listName, query } = this.props;
    return (
      <SectionTableQuery query = {query}>
        {({ data = {}, error, loading }) => {
          if (loading) {
            ...
          }
          if (error !== undefined) {
            ...
          }
          return (
            <tbody>
              {(data[listName]||[]).map(elem => (
                <tr key = {elem.id}>
                  <th scope = "row">{elem.id}</th>
                  {Object.keys(elem).map((k, i) => {
                    if (k !== 'id' && k !== '__typename') {
                      return <td key = {elem[k]}>{elem[k]}</td>;
                    }
                  })}
                </tr>
              ))}
            </tbody>
          );
        }}
      </SectionTableQuery>
    );
  }
}
<SectionTable query = {...} listName = "allTeams" />
<SectionTable query = {...} listName = "allGames" />

если вы хотите иметь другую строку, добавьте даже функцию рендеринга для настройки строки

Это на самом деле работает, но теперь я также получаю некоторые ошибки машинописного текста, ха-ха, как только я выясню их, я думаю, это будет идеально :) спасибо

Uj Corb 21.04.2019 13:05

Другие вопросы по теме