添加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的數量,以便 我們無任何延遲地改變我們的「總計」顯示。