添加Todo更复杂。原因是我们需要更新 不仅是我们将创建的Todo对象的状态,而且还有一个存储它的连接 - Todos的计数将会改变, 以及Todo节点的列表在边缘。
import Relay from 'react-relay';
export default class AddTodoMutation extends Relay.Mutation {
static fragments = {
viewer:() => Relay.QL`fragment on ReindexViewer {
id
allTodos {
count,
}
}`
};
getMutation() {
return Relay.QL`mutation{ createTodo }`;
}
getVariables() {
return {
text: this.props.text,
complete: false,
};
}
getFatQuery() {
return Relay.QL`
fragment on _TodoPayload {
changedTodoEdge,
viewer {
id,
allTodos {
count
}
}
}
`;
}
getConfigs() {
return [{
type: 'RANGE_ADD',
parentID: this.props.viewer.id,
connectionName: 'allTodos',
edgeName: 'changedTodoEdge',
rangeBehaviors: {
'': 'prepend',
},
}, {
type: 'FIELDS_CHANGE',
fieldIDs: {
viewer: this.props.viewer.id,
},
}];
}
getOptimisticResponse() {
return {
changedTodoEdge: {
node: {
text: this.props.text,
complete: false,
},
},
viewer: {
id: this.props.viewer.id,
allTodos: {
count: this.props.viewer.allTodos.count + 1,
},
},
};
}
}
为了执行这一突变,我们需要一些数据可能不是 提供给组件 - allTodos连接的观众对象的ID和计数。因此,我们需要为我们为容器指定它们的方式指定 突变的片段。
我们的配置也更复杂 - 我们需要将新的 Todo添加到连接,因此我们使用RANGE_ADD突变配置。继电器 预计在有效载荷中传递边缘,而不仅仅是Todo,Reindex 为此提供了changedTodoEdge。最后,我们需要从服务器获取更新的连接计数 ,并且对于此查看器字段,每个有效负载均可用 。
在我们的乐观更新中,我们增加了allTodos的数量,以便 我们无任何延迟地改变我们的“总计”显示。