来自 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 突变的动态响应的主要内容,如果未能解决你的问题,请参考以下文章