Оптимистичный интерфейс не обновляется - Apollo
После внесения мутации пользовательский интерфейс не обновляется добавленным элементом до тех пор, пока страница не будет обновлена. Я подозреваю, что проблема в разделе обновления мутации, но я не уверен, как устранить неполадки дальше. Любой совет высоко ценится.
Запрос (отдельный файл)
//List.js
export const AllItemsQuery = gql`
query AllItemsQuery {
allItems {
id,
name,
type,
room
}
}
`;
перегласовка
import {AllItemsQuery} from './List'
const AddItemWithMutation = graphql(createItemMutation, {
props: ({ownProps, mutate}) => ({
createItem: ({name, type, room}) =>
mutate({
variables: {name, type, room},
optimisticResponse: {
__typename: 'Mutation',
createItem: {
__typename: 'Item',
name,
type,
room
},
},
update: (store, { data: { submitItem } }) => {
// Read the data from the cache for this query.
const data = store.readQuery({ query: AllItemsQuery });
// Add the item from the mutation to the end.
data.allItems.push(submitItem);
// Write the data back to the cache.
store.writeQuery({ query: AllItemsQuery, data });
}
}),
}),
})(AddItem);
2 ответа
Выглядит многообещающе, одна вещь, которая неправильна, это название результата мутации data: { submitItem }
, Потому что в оптимистическом ответе вы объявляете это createItem
, Вы console.log и как выглядит мутация?
update: (store, {
data: {
submitItem // should be createItem
}
}) => {
// Read the data from our cache for this query.
const data = store.readQuery({
query: AllItemsQuery
});
// Add our comment from the mutation to the end.
data.allItems.push(submitItem); // also here
// Write our data back to the cache.
store.writeQuery({
query: AllItemsQuery,
data
});
}
Я не совсем уверен, что проблема с optimisticResponse
Функция у вас выше (это правильный подход), но я думаю, вы используете неправильное возвращаемое значение. Например, вот ответ, который мы используем:
optimisticResponse: {
__typename: 'Mutation',
updateThing: {
__typename: 'Thing',
thing: result,
},
},
Поэтому, если бы мне пришлось делать какие-то предположения, я бы сказал, что вы можете попробовать использовать тип в возвращаемом значении:
optimisticResponse: {
__typename: 'Mutation',
createItem: {
__typename: 'Item',
item: { // This was updated
name,
type,
room
}
},
},
В качестве альтернативы вы можете просто refetch
, Несколько раз в нашей кодовой базе вещи просто не обновлялись так, как мы этого хотим, и мы не могли понять, почему, поэтому мы собираемся и просто перезагружаемся после разрешения мутации (мутации возвращают обещание!). Например:
this.props.createItem({
... // variables go here
}).then(() => this.props.data.refetch())
Второй подход должен работать каждый раз. Это не совсем оптимистично, но это приведет к обновлению ваших данных.