6

Mam zapytanie upsert, które zostanie uruchomione podczas tworzenia lub aktualizacji. Po aktualizacji Apollo integruje wynik w pamięci podręcznej, ale w momencie jej utworzenia nie.Klient Apollo: mutacja typu "upsert" modyfikuje pamięć podręczną tylko podczas aktualizacji, ale nie przy tworzeniu

Oto zapytanie:

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

Mój klient:

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

Odpowiedź z serwera jest identyczna: Zarówno id i body są zwracane ale Apollo nie jest dodawanie nowych identyfikatorów do data obiekt pamięci podręcznej automatycznie.

Czy można automatycznie dodawać nowe obiekty do data bez uruchamiania późniejszego pobierania?

Oto co mój magazyn danych wygląda następująco:

enter image description here

UPDATE

Zgodnie z dokumentacją, funkcja updateQueries ma pozwolić mi wcisnąć nowy element do mojej listy zasobów bez konieczności ponownego wyzwalania zapytania o źródło pochodzenia.

Funkcja zostaje wykonana, ale to, co zwraca funkcja, jest całkowicie ignorowane, a pamięć podręczna nie jest modyfikowana.

Nawet jeśli robię coś takiego:

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

Nic się nie zmienia.

UPDATE # 2

nadal nie można uzyskać wykaz mój majątek, aby zaktualizować.

Wewnątrz updateQueries, tutaj jest to, co mój previousQueryResult wygląda następująco:

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

ale niezależnie od tego, co wrócę, magazyn danych nie odświeża:

enter image description here

Dla porównania, tutaj jest jak wyglądają poszczególne asset:

enter image description here

Odpowiedz

0

Podczas aktualizacji należy użyć updateQueries, aby zaktualizować zapytania związane z tą mutacją. Chociaż Twoje pytanie nie precyzuje, jakiego rodzaju zapytania ma być aktualizowana na skutek mutacji, zakładam, że masz coś takiego:

query myMadeUpQuery { 
    note { 
    id 
    body 
    } 
} 

które powinny powrócić do listy notatek obecnie w swoim systemie z identyfikatorem i treść każdej z nut.Z updateQueries, twój callback odbiera wynik zapytania (tj. Informację o nowo wstawionej notatce) i poprzedni wynik tego zapytania (tj. Listę notatek) i twój callback musi zwrócić nowy wynik, który powinien zostać przypisany do zapytania powyżej.

Zobacz analogiczny przykład: here. Zasadniczo, bez immutability-helper że podany przykład używa, można napisać updateQueries zwrotnego następująco:

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

Przepraszamy za opóźnienie w odpowiedzi Dhaivat. Właśnie aktualizuję moje pytanie z aktualizacją nr 2. Nadal niestety nie można tego uruchomić poprawnie. –

1

Czy za przykładem here? chciałbym napisać updateQueries w zmutować tak:

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

Albo z obiektu Przypisanie zamiast aktualizacji z niezmienności pomocnicze:

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

dzięki za odpowiedź. Próbowałem obu twoich rekomendacji i one nie działają. Podążyłem też za linkiem, który wysłałeś wcześniej bez powodzenia. Co się dzieje, to pomyślne żądanie grafql zostało pomyślnie wykonane, ale nowo utworzony zasób nie zostanie dodany do listy zasobów dopóki nie odświeżę strony. Z pewnością jest to niesamowite. –