我不使用Relay容器,因为我希望能够更好地控制组件。而不是它我使用HOC + Relay.Store.forceFetch
,它使用变量获取任何给定的查询。所以我有以下查询:
query {
root {
search(filter: $filter) {
selectors {
_id,
data {
title,
status
}
},
selectorGroups {
_id,
data {
title,
}
}
}
}
}
然后我必须在selector
类型上做一些变异。
export default class ChangeStatusMutation extends Relay.Mutation {
getMutation() {
return Relay.QL`mutation {selectors_status_mutation}`;
}
getVariables() {
return {
id: this.props.id,
status: this.props.status
};
}
getFatQuery() {
return Relay.QL`
fragment on selectors_status_mutationPayload{
result {
data {
status
}
}
}
`;
}
static fragments = {
result: () => Relay.QL`
fragment on selector {
_id,
data {
title,
status
}
}`,
};
getOptimisticResponse() {
return {
result: {
_id: this.props.id,
data: {
status: this.props.status
}
}
};
}
getConfigs() {
return [{
type: 'FIELDS_CHANGE',
fieldIDs: {
result: this.props.id
},
}];
}
}
调用组件中的突变:
const mutation = new ChangeStatusMutation({id, status, result: selector});
Relay.Store.commitUpdate(mutation);
中继存储中的变异承诺选择器未更改。我想那是因为空Tracked Fragment Query
并且突变执行时没有任何字段:
ChangeStatusMutation($input_0:selectors_statusInput!) {
selectors_status_mutation(input:$input_0) {
clientMutationId
}
}
但是Relay已经提取了修改选择器,并将其传递给带有props的变种。因此,Relay知道应该更改的类型,如何查找项目以及应该替换哪些字段。但不能相交。怎么了?
答案 0 :(得分:1)
所以,你绝对有点"离开牧场"这里避免使用Relay容器,但我认为这仍然有用......
Relay通过查找FIELDS_CHANGE
配置指示的节点来执行查询交集。在这种情况下,您的fieldIDs
将其指向标识为result
的{{1}}节点。
您确定商店中有一个带有该ID的节点吗?我注意到,在您的this.props.id
查询中,您获取了某种替代forceFetch
但实际上并未提取_id
。 Relay需要id
字段出现在您以后想要重新获取或使用声明性变异API的任何内容上...
我首先检查您要发送的查询以获取此id
类型的内容。我没有看到你在问题描述中的任何地方抓到它,所以我只是假设你现在可能没有拿到它?