6

У меня есть запрос upsert, который запускается при создании или обновлении. При обновлении Apollo интегрирует результат в кеш, но при создании его нет.Apollo Client: мутация Upsert только модифицирует кеш при обновлении, но не при создании

Вот запрос:

export const UPSERT_NOTE_MUTATION = gql` 
    mutation upsertNote($id: ID, $body: String) { 
    upsertNote(id: $id, body: $body) { 
     id 
     body 
    } 
    }` 

Мой клиент:

const graphqlClient = new ApolloClient({ 
    networkInterface, 
    reduxRootSelector: 'apiStore', 
    dataIdFromObject: ({ id }) => id 
}); 

Ответ от сервера идентичен: Оба id и body возвращаются, но Аполлон не добавляет новых идентификаторов в data объект кэша автоматически.

Возможно ли, что Apollo автоматически добавит новые объекты в data без запуска последующей выборки?

Вот что мой магазин данных выглядит следующим образом:

enter image description here

UPDATE

Согласно документации, функция updateQueries должна позволить мне выдвинуть новый элемент в мой список активов без необходимости повторять запрос на выборку из моего источника.

Функция выполняется, но все, что возвращается функцией, полностью игнорируется, и кеш не изменяется.

Даже если я что-то вроде этого: не меняет

updateQueries: { 
     getUserAssets: (previousQueryResult, { mutationResult }) => { 
     return {}; 
     } 
    } 

Ничто.

UPDATE # 2

До сих пор не могу получить список активов, чтобы обновить.

Внутри updateQueries, вот что мой previousQueryResult выглядит следующим образом:

updateQueries: { 
     getUserAssets: (previousQueryResult, { mutationResult }) => { 
     return { 
      assets: [] 
      .concat(mutationResult.data.upsertAsset) 
      .concat(previousQueryResult.assets) 
     } 
     } 
    } 

Но независимо от того, что я вернусь, хранилище данных не обновляется:

enter image description here

Для справки, здесь что каждый asset выглядит так:

enter image description here

ответ

0

Как вы заявляете в своем обновлении, вам необходимо использовать updateQueries, чтобы обновить запросы, связанные с этой мутацией. Хотя ваш вопрос не указывает, какой запрос должен быть обновлен в результате мутации, я предполагаю, что у вас есть что-то вроде этого:

query myMadeUpQuery { 
    note { 
    id 
    body 
    } 
} 

, который должен возвращать список заметок в настоящее время в вашей системе с идентификатором и тело каждой из заметок.С updateQueries ваш обратный вызов получает результат запроса (т. Е. Информацию о недавно вставленной ноте) и предыдущий результат этого запроса (т. Е. Список заметок), и ваш обратный вызов должен вернуть новый результат, который должен быть назначен запросу выше.

См. here для аналогичного примера. По существу, без immutability-helper что данный пример использует, вы могли бы написать updateQueries функцию обратного вызова следующим образом:

updateQueries: { 
    myMadeUpQuery: (previousQueryResult, { mutationResult }) => { 
    return { 
     note: previousQueryResult.note(mutationResult.data.upsertNode), 
    }; 
    } 
} 
+0

Извините за поздний ответ Dhaivat. Я просто обновляю свой вопрос с обновлением # 2. Тем не менее, к сожалению, это не может нормально работать. –

1

следовали примеру вы here? я бы написать updateQueries в мутировать, как это:

updateQueries: { 
    getUserAssets: (previousQueryResult, { mutationResult }) => { 
    const newAsset = mutationResult.data.upsertAsset; 
    return update(prev, { 
     assets: { 
     $unshift: [newAsset], 
     }, 
    }); 
    }, 
} 

Или с объектом правопреемника вместо обновления от неизменности-хелперов:

updateQueries: { 
    getUserAssets: (previousQueryResult, { mutationResult }) => { 
    const newAsset = mutationResult.data.upsertAsset; 
    return Object.assign({}, prev, {assets: [...previousQueryResult.assets, newAsset]}); 
    }, 
} 
+0

спасибо за ответ. Я пробовал обе ваши рекомендации, и они не работают. Я также следил за ссылкой, которую вы отправили раньше, не повезло. Дело в том, что успешный запрос graphql выполняется успешно, но вновь созданный актив не добавляется в список активов, пока я не обновляю страницу. Это определенно ошеломительно. –

 Смежные вопросы

  • Нет связанных вопросов^_^