私はリレー・コンテナを使用しません。なぜなら、コンポーネントをより詳細に制御したいからです。代わりに、私は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はタイプ、変更すべきもの、アイテムの見つけ方、およびどのフィールドを置き換えるべきかを知っています。しかし交差することはできません。どうしましたか?
私は多くのリレーの例でIDフィールドに出くわしましたが、それは必須であることはわかりませんでした(私は試してみます –
'result'フィールドについては正確に同じように要求されていませんでした。しかし、 'result'の型は' selector'であり、セレクタは第一の大きなクエリ 'selectors {...'で要求されていましたので、正しい交差のためにフィールド名はまったく同じでなければなりません。 –
交差は、フィールド名ではなくidに基づいています。そのため、あなたがそれを提供していることを確認する必要があります(そして、有効な既存のIDをfieldIDsに渡す必要があります) – NevilleS