来自 GraphQL 突变的动态响应

Posted

技术标签:

【中文标题】来自 GraphQL 突变的动态响应【英文标题】:Dynamic response from GraphQL mutation 【发布时间】:2020-01-17 07:39:25 【问题描述】:

我正在使用 Apollo-Client 来处理 GraphQL 后端 (php),并且遇到了一些突变问题。

我正在处理的当前组件集是用户详细信息的表单。使用查询获取和显示详细信息,并且可以编辑和保存。当用户保存时,会进行检查以确定哪些值已更改,并通过要更新的突变发送这些值。

我遇到的问题是我只希望从突变中返回已更新的数据,因为返回 可能 已更新的每个字段都会为响应增加很多时间。有没有办法动态构建突变来决定返回哪些字段?

这是当前状态的突变:

const UPDATE_CLIENT = gql`
mutation updateClient( $data: [ClientInput]! ) 
    add_update_clients( data: $data ) 
        id
        ref
        name 
            title
            firstname
            surname
            preferred_name
        
        gender
        dob
        nhs_number
        email
        telephone 
            number
        
        mobile 
            number
        
        region 
            id
            name
        
        referral_received
        user_aware_of_referral
        referred_for 
          id
          name
        
        weekly_hours
        contract_date
        service_start_date
        expected_end_date
        service_end_date
        reason_left
        po_number
        accounting_ref
        country_of_birth 
            id
            name
        
        nationality 
            id
            name
        
        ni_number
        place_of_birth
        ethnicity 
            id
            name
        
        first_language 
            id
            name
        
        religion 
            id
            name
        
        marital_status
        dependants
        sexual_orientation
        height
        weight
        hair_colour
        eye_colour
    

`;

还有一小段代码提交

const mutation = await client.mutate(
            mutation: UPDATE_CLIENT,
            variables:  data ,
            errorPolicy: 'all'
        );

但本质上,如果我更新 dob,那么这是我想要的唯一响应数据

【问题讨论】:

【参考方案1】:

您可以使用@skip@include 指令来指定应从选择集中省略的字段。如果您要跟踪客户端更新了哪些字段,则可以使用这些值创建一组变量以传递给您的查询。

mutation updateClient(
  $data: [ClientInput]!
  $includeGender: Boolean = false
  $includeDob: Boolean = false
  $includeEmail: Boolean = false
  # ... and so on
  ) 
  add_update_clients( data: $data ) 
    gender @include(if: $includeGender)
    dob  @include(if: $includeDob)
    email  @include(if: $includeEmail)
    # ... and so on
  

【讨论】:

但我猜如果这些值存在于ClientInput 中,就没有办法做到这一点?本质上,它是一个充满需要更改的数据的对象,即[ClientInput] = id: 5, firstname: "john" - 为具有 20 个值的表单编写每个布尔值似乎需要做很多工作,我认为 GraphQL 应该可以改善数据流.. 不幸的是,当前规范中没有支持这种功能的语法。与其试图减少响应的大小,我会 A)提高后端的性能或 B)利用 optimistic responses 来保持你的 UI 响应,无论响应速度如何。

以上是关于来自 GraphQL 突变的动态响应的主要内容,如果未能解决你的问题,请参考以下文章

使用 apollo 捕获来自 graphql 的特定响应

GraphQL 查询/突变的响应

GraphQL - 突变响应后的自定义错误消息

如何使用动态别名在单个请求中多次调用 GraphQL 突变

如何:具有动态区域/组件的 Strapi GraphQL 突变

我可以触发 Lambda 函数或 SNS 事件来响应 AppSync GraphQL 突变吗?