【发布时间】:2017-01-21 07:53:55
【问题描述】:
我不使用 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);
Relay 存储中的突变承诺选择器未更改。我猜这是因为空的Tracked Fragment Query 并且突变执行时没有任何字段:
ChangeStatusMutation($input_0:selectors_statusInput!) {
selectors_status_mutation(input:$input_0) {
clientMutationId
}
}
但是 Relay 已经获取了修改选择器,我将它传递给带有 props 的突变。所以 Relay 知道应该更改的类型、如何找到项目以及应该替换哪些字段。但不能相交。怎么了?
【问题讨论】: