在嵌套属性上使用 useResult 选择 graphql 数据

Posted

技术标签:

【中文标题】在嵌套属性上使用 useResult 选择 graphql 数据【英文标题】:Select graphql data with useResult on nested properties 【发布时间】:2021-03-13 10:09:51 【问题描述】:

我们有一个这样执行的 graphql 查询:

// rosterDispatchGroup.query.graphql
query rosterDispatchGroup($fromDate: DateTime!) 
  rosterDispatchGroup(fromDate: $fromDate) 
    ... on ApiError 
      message
    
    ... on RosterDispatchGroupArray 
      data 
        date
        dispatchGroup
      
    
  

并返回数据array(或ApiError 的情况下的消息):


  "data": 
    "rosterDispatchGroup": 
      "data": [
        
          "date": "2020-10-28",
          "dispatchGroup": [ "A" ]
        
    ]

要在 Vue 模板中使用这些数据,我们这样做:

import  useResult  from '@vue/apollo-composable'
import  defineComponent  from '@vue/composition-api'
import  useRosterDispatchGroupQuery  from 'src/graphql/generated/operations'

export default defineComponent(
  setup() 
    const  result, loading, error  = useRosterDispatchGroupQuery(
      () =>  return  fromDate: new Date()  ,
    )

    const dispatchGroups = useResult( result, [],
      (data) => data.rosterDispatchGroup.data // property data does not exist on type
    )
    return  dispatchGroups, loading, error 
  ,
)

此代码运行良好,但我们收到以下打字稿错误消息:

nitpick the result 和 useResult 的正确方法是什么并避免打字稿错误?我们使用graphql-codegen 生成所需的打字稿代码,并使用this tutorial 获得灵感。

【问题讨论】:

【参考方案1】:

想通了。我们只需要在返回对象数据'array'之前检查__typename属性:

export default defineComponent(
  setup() 
    const dispatchGroups = useResult(result, [], (data) => 
      if (data.rosterDispatchGroup.__typename === 'RosterDispatchGroupArray') 
        return data.rosterDispatchGroup.data
      
    )

    const apiError = useResult(result, null, (data) => 
      if (data.rosterDispatchGroup.__typename === 'ApiError') 
        return data.rosterDispatchGroup
      
    )

【讨论】:

以上是关于在嵌套属性上使用 useResult 选择 graphql 数据的主要内容,如果未能解决你的问题,请参考以下文章

pandas json_normalize 展平嵌套字典

使用嵌套结构的参数使用 django-graphene 过滤父级

如何在同一个选择器上使用`&`和标签

用 setState() 更新嵌套的 React 状态属性的最佳选择是啥?

使用 jQuery 和 Math.random() 选择嵌套对象属性

Nodejs mongoose根据对象属性选择嵌套数组中的对象