GraphQL突变产生的动态响应

时间:2019-09-16 12:52:48

标签: reactjs graphql apollo react-apollo apollo-client

我正在使用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 个答案:

答案 0 :(得分:0)

您可以使用@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
  }
}