Todoを追加する方が複雑です。その理由は、 を更新する必要があるということです。 も格納されている接続 - Todosの数が変更されます。 とTodoノードのリストエッジで。 allTodos接続のビューアオブジェクトのIDとカウント数 - この変異を行うために
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,
},
},
};
}
}
は、私たちは、コンポーネントが利用できる ではないかもしれないいくつかのデータを必要とします。したがって、我々は容器に指定するのと同じ方法で 変異の断片を指定する必要があります。
私たちの設定は今度はもっと複雑です - 接続に新しい Todoを追加する必要があるので、私たちはRANGE_ADD mutation configを使用します。リレー は、Todo、Reindexだけでなく、ペイロードにエッジが渡されることを予期します。 はchangedTodoEdgeを提供します。最後に、更新された の接続数をサーバーから取得する必要があります。このビューアのフィールドでは、すべてのペイロードで利用可能な です。
私たちの楽観的なアップデートでは、allTodosの数を増やすので、 は「総計」ディスプレイを遅滞なく変更します。