首页 文章

EnumValues的内省查询作为react-component中的GraphQL片段

提问于
浏览
1

我正在使用GraphQL(在graph.cool上托管)和Relay Schema构建一个React Native应用程序 . 我在顶级组件中有一个QueryRenderer,使用片段获取表示组件的数据,这很好 .

我的问题:我想做一个内省查询来获取可能的枚举值作为列表,对于我的模式中的特定字段,并在片段旁边获取这些值 . 我对片段的当前查询:

query ReportingContainerQuery {
    viewer {
        ...MainList_items
           ...
    }
}

MainList_items片段:

fragment AnimalList_items on Viewer {
    allAnimalCategories {
        edges {
            node{
                id
                ...AnimalListRow_item
            }
        }
    }
}

我得到以下查询用于通过内省获取enumValues(使用:https://www.graph.cool/forum/t/how-to-access-the-possible-values-of-an-enum-type-created-inside-the-console/23/2):

query {
    __type(name: "JOURNAL_ENTRY_GENDER") {
        enumValues {
            name
        }
    }
}

但我似乎无法找到一种方法来创建可以添加到顶级查询的片段 . 我可以直接将内省粘贴到顶级查询中,但就我所理解的那样,这会对中继框架起作用 . 由于这样做,我必须显式地将结果作为道具传递,而不是让表示组件指定它需要的东西,并将其作为片段提供给顶层的QueryRenderer并让中继框架隐式传递查询结果到组件 .

1 回答

  • 1

    经过一些修补我找到了解决它的方法 - 它留下了两个地方来维护片段查询,但这是我发现解决它的唯一方法 . :)

    在我的组件中,我定义了以下片段:

    fragment GenderTile_items on __Type {
      enumValues{
        name
      }
    }
    

    然后在我的主容器中,我使用以下内容在QueryRenderer中扩展了查询

    query ReportingContainerQuery {
      viewer {
        ...MainList_items
           ...
      }
    
      __type(name: "JOURNAL_ENTRY_GENDER"){
         ...GenderTile_items
      }
    }
    

    然后,通过将'props._type'向下传递给具有相应片段的组件并从那里访问props.items.enumValues(因为数据的prop在片段中被定义为'items'(例如GenderTile),可以在successblock中获得来自QueryRenderer的结果枚举数据 . items 遵循命名约定'FileName_propName' . (https://facebook.github.io/relay/docs/fragment-container.html#data-dependencies-with-graphql)) .

    然后我遇到了我想要获取多种类型的枚举的问题,并且查询返回了带有重复__type赋值的错误 . 这可以通过使用别名来解决这个问题:

    query ReportingContainerQuery {
      viewer {
        ...MainList_items
           ...
      }
    
      genderEnums: __type(name: "JOURNAL_ENTRY_GENDER"){
         ...GenderTile_items
      }
    
      otherEnums: __type(name: "JOURNAL_ENTRY_OTHER"){
         ...OtherComponent_items
      }
    }
    

    然后可以通过道具[别名](例如'props.genderEnums'和'props.otherEnums')获取数据,然后将其传递给带有片段的组件,如上所述通过props.items.enumValues访问它 .

    希望对于遇到与我一样的问题的其他人都有意义 . :d

相关问题