J'ai une mutation createObject
qui renvoie l'ID du nouvel objet.
Après le retour, je souhaite rediriger vers une page de détail sur le nouvel objet.
Comment puis-je obtenir des champs de réponse à partir d'une mutation dans le composant contenant en utilisant réactivité / relais?
Par exemple, ma page createObject
contient la mutation avec un code comme:
var onFailure = (transaction) => { }; var onSuccess = () => { redirectTo('/thing/${newthing.id}'); // how can I get this ID? }; // To perform a mutation, pass an instance of one to `Relay.Store.update` Relay.Store.update(new AddThingMutation({ userId: this.props.userId, title: this.refs.title.value, }), { onFailure, onSuccess }); }
newthing
doit être l'objet créé par la mutation, mais comment puis-je l'obtenir?
Normalement, nous configurons le côté client de la mutation avec RANGE_ADD
et RANGE_ADD
une nouvelle thingEdge
du côté serveur de la mutation, mais ici, vous n'avez pas une plage sur le client pour ajouter le nouveau nœud. Pour indiquer à Relay de récupérer un champ arbitraire, utilisez la configuration REQUIRED_CHILDREN
.
var AddThingMutation = mutationWithClientMutationId({ /* ... */ outputFields: { newThingId: { type: GraphQLID, // First argument: post-mutation 'payload' resolve: ({thing}) => thing.id, }, }, mutateAndGetPayload: ({userId, title}) => { var thing = createThing(userId, title); // Return the 'payload' here return {thing}; }, /* ... */ });
class AddThingMutation extends Relay.Mutation { /* ... */ getConfigs() { return [{ type: 'REQUIRED_CHILDREN', // Forces these fragments to be included in the query children: [Relay.QL` fragment on AddThingPayload { newThingId } `], }]; } /* ... */ }
var onFailure = (transaction) => { // ... }; var onSuccess = (response) => { var {newThingId} = response.addThing; redirectTo(`/thing/${newThingId}`); }; Relay.Store.update( new AddThingMutation({ title: this.refs.title.value, userId: this.props.userId, }), {onSuccess, onFailure} );
Notez que tous les champs que vous recherchez en utilisant cette technique seront mis à la onSuccess
rappel de l' onSuccess
, mais ne seront pas ajoutés au magasin côté client.