Ответ 1
Обычно мы будем настраивать клиентскую сторону мутации с помощью RANGE_ADD
и возвращать новую thingEdge
с серверной части мутации, но здесь у вас нет диапазона на клиенте, чтобы добавить новый node to. Чтобы передать Relay для получения произвольного поля, используйте конфигурацию 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}
);
Обратите внимание, что любые поля, которые вы запрашиваете, используя эту технику, будут доступны для обратного вызова onSuccess
, но не будут добавлены в хранилище на стороне клиента.