what modern framework automotriz javascript reactjs relayjs

javascript - modern - ¿Cómo obtener la ID de un nuevo objeto a partir de una mutación?



relay vs apollo (1)

Tengo una mutación createObject que devuelve el ID del nuevo objeto.

Después de que vuelva, quiero redireccionar a una página de detalles sobre el nuevo objeto.

¿Cómo puedo obtener campos de respuesta de una mutación en el componente que contiene el uso de reaccionar / retransmitir?

Por ejemplo, mi página createObject contiene la mutación con código como:

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 debería ser el objeto creado por la mutación, pero ¿cómo puedo obtenerlo?


Normalmente configuraríamos el lado del cliente de la mutación con RANGE_ADD y devolveríamos un nuevo thingEdge del lado del servidor de la mutación, pero aquí no tenemos un rango en el cliente para agregar el nuevo nodo. Para decirle a Relay que busque un campo arbitrario, use la configuración REQUIRED_CHILDREN .

Mutación del lado del servidor

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}; }, /* ... */ });

Mutación del lado del cliente

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 } `], }]; } /* ... */ }

Ejemplo de uso

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} );

Tenga en cuenta que cualquier campo que consulte mediante esta técnica estará disponible para la onSuccess llamada onSuccess , pero no se agregará a la tienda del lado del cliente.