Как исключить Relay Modern Containers из условных компонентов?

Можно ли исключить вложенные контейнеры из запроса, когда используется троичный оператор / оператор switch?

В следующем примере, когда ComponentController получает тип HEADER, запрос GraphQL возвращает ВСЕ поля контейнеров реле из оператора switch (троичные выражения делают то же самое). Контейнер Header запрашивает только заголовок, но поскольку Article запрашивает title, subtitle, body, запрос GraphQL возвращает title, subtitle, body (Примечание. Компонент Header не имеет доступа ко всем этим полям, но на вкладке сети я вижу все другие поля запрашиваются и возвращаются с данными).

Родительский контейнер

const ComponentController = props => {
  return (() => {
    switch (props.type) {
      case 'ARTICLE':
        return <Article article={props.article} />;
      case 'HEADER':
        return <Header article={props.article} />;
      default:
        return null;
    }
  })();
};

export default createFragmentContainer(
  ComponentController,
  graphql`
    fragment ComponentController_article on Article {
      ...Header_article
      ...Article_article
    }
  `,
);

заголовок

const Header = props => {
  return <h1>{props.article.title}</h1>;
};

export default createFragmentContainer(
  Header,
  graphql`
    fragment Header_article on Article {
      title
    }
  `,
);

Статья

const Article = props => {
  return <div>
     <h1>{props.article.title}</h1>
     <h5>{props.article.subtitle}</h5>
     <p>{props.article.body}</p>
  </div>;
};

export default createFragmentContainer(
  Header,
  graphql`
    fragment Header_article on Article {
      title
      subtitle
      body
    }
  `,
);

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

Спасибо за прочтение

0 ответов

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