Как передать параметр во фрагмент graphql?

Передать параметр в запрос GraphQL легко. А как насчет фрагментов GraphQL?

Этот код содержит несколько совершенно нормальных запросов с параметром (itemId) и намеком на то, что я пытаюсь сделать (includeExtraResults):

export const GET_ITEM = gql`
  query GetItem($itemId: ID!, $includeExtraResults:BOOLEAN) {
    container {
      item(itemId: $itemId) {
        itemId
        someField
        innerItem(someExtraOption: $includeExtraResults) {
          ...InnerItemFragment
        }
      }
    }
  }
  ${INNER_ITEM_FRAGMENT}
`;

export const INNER_ITEM_FRAGMENT = gql`
  fragment InnerItemFragment on InnerItemType {
    innerItemId
    innerInnerItem(someExtraOption: $includeExtraResults) {
      someFields
    }
  }
  ${INNER_INNER_ITEM_FRAGMENT}
`;


export const INNER_INNER_ITEM_FRAGMENT = gql`
  /* (not detailed here) */
`;

Когда внутренние внутренние элементы автоматически запрашиваются как часть внутренних элементов, я не хочу, чтобы они возвращали поле, на основе которого работает фильтр. Клиент тоже не знает логики. Вместо этого я хочу использовать параметр, и логика определяется на стороне сервера.

Тем не менее, их запрос реализован таким образом, что ему нужен (необязательный) параметр «includeExtraResults», который передается в GetItem в первую очередь.

Итак, есть ли способ передать «includeExtraResults» во внутренний фрагмент? Что нужно изменить, чтобы это имело смысл? В реальной жизни это сложная система с множеством уровней внутренних фрагментов.

Умерло ли Create-React-App?
Умерло ли Create-React-App?
В этом документальном фильме React.dev мы исследуем, мертв ли Create React App (CRA) и какое будущее ждет этот популярный фреймворк React.
Освоение React Native: Пошаговое руководство для начинающих
Освоение React Native: Пошаговое руководство для начинающих
React Native - это популярный фреймворк с открытым исходным кодом, используемый для разработки мобильных приложений. Он был разработан компанией...
В чем разница между react native и react ?
В чем разница между react native и react ?
React и React Native - два популярных фреймворка для создания пользовательских интерфейсов, но они предназначены для разных платформ. React - это...
От React к React Native: Руководство для начинающих по разработке мобильных приложений с использованием React
От React к React Native: Руководство для начинающих по разработке мобильных приложений с использованием React
Если вы уже умеете работать с React, создание мобильных приложений для iOS и Android - это новое приключение, в котором вы сможете применить свои...
Хуки React: что это такое и как их использовать
Хуки React: что это такое и как их использовать
Хуки React - это мощная функция библиотеки React, которая позволяет разработчикам использовать состояние и другие возможности React без написания...
16
0
12 297
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Как указано в здесь, вы должны явно включить переменные фрагмента перед их использованием:

import { enableExperimentalFragmentVariables } from 'graphql-tag'

enableExperimentalFragmentVariables()

По крайней мере, это должно позволить вам использовать переменные, определенные в вашей операции, внутри включенных фрагментов. Обратите внимание, что это по-прежнему экспериментальная функция, которая официально не является частью спецификации — см. Эта проблема для текущего обсуждения.

Не могли бы вы добавить пример для демонстрации синтаксиса прямо здесь, в stackoverflow?

jeancallisti 29.03.2019 16:42

@jeancallisti Вышеупомянутое должно работать с кодом в вашем вопросе. Никаких изменений, кроме включения этой функции, не требуется. Что непонятного в синтаксисе?

Daniel Rearden 29.03.2019 17:01

Хорошо, тогда, если он работает "как есть" и если includeExtraResults можно передать в innerInnerItem, тогда все в порядке. Интересно, как отреагирует компилятор, если я включу этот фрагмент в другой запрос, у которого нет параметра, но это для другого дня.

jeancallisti 02.04.2019 11:50

Я думаю, что graphql-tag все еще будет анализировать это, но вы определенно столкнетесь с ошибкой сервера, поскольку ваш запрос не пройдет проверку.

Daniel Rearden 02.04.2019 12:46
Ответ принят как подходящий

Это не то же самое, но все же связано:

Вы можете использовать переменные запроса внутри фрагментов:

query HeroComparison($first: Int = 3) {
  leftComparison: hero(episode: EMPIRE) {
    ...comparisonFields
  }
  rightComparison: hero(episode: JEDI) {
    ...comparisonFields
  }
}

fragment comparisonFields on Character {
  name
  friendsConnection(first: $first) {
    totalCount
    edges {
      node {
        name
      }
    }
  }
}

Эта информация от официальное руководство

На самом деле я пытался добиться этого, поэтому я изменил «правильный ответ» на ваш ответ (после почти 3 лет, когда другой ответ был отмечен зеленой галочкой ;-p). Я не помню, почему я столкнулся с проблемами и что заставило меня поверить, что я не могу использовать глобальный параметр запроса во фрагменте. Возможно, я использовал некоторые автоматически сгенерированные обертки Typescript и/или какой-то инструмент проверки синтаксиса (Lint), которые бросали красные флажки по этому поводу. Или, может быть, я просто не был достаточно смелым, чтобы предположить, что это сработает.

jeancallisti 10.12.2021 14:28

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