2016-11-08 33 views
10

mam mutację jakJak obsługiwać Usuwa się reagować-apollo

mutation deleteRecord($id: ID) { 
    deleteRecord(id: $id) { 
     id 
    } 
} 

iw innym miejscu mam listę elementów.

Czy jest coś lepszego, co mogę zwrócić z serwera i jak mam zaktualizować tę listę?

Bardziej ogólnie, jaka jest najlepsza praktyka w usuwaniu błędów w apollo/graphql?

+0

Uwaga do siebie: Ta strona może być przydatna http: //dev.apollodata.com/react/cache-updates.html#updateQueries – derekdreery

Odpowiedz

9

nie jestem pewien, że jest dobry styl praktyka ale tutaj jest to, jak sobie radzić usunięcie elementu w reagują-Apollo z updateQueries:

import { graphql, compose } from 'react-apollo'; 
import gql from 'graphql-tag'; 
import update from 'react-addons-update'; 
import _ from 'underscore'; 


const SceneCollectionsQuery = gql ` 
query SceneCollections { 
    myScenes: selectedScenes (excludeOwner: false, first: 24) { 
    edges { 
     node { 
     ...SceneCollectionScene 
     } 
    } 
    } 
}`; 


const DeleteSceneMutation = gql ` 
mutation DeleteScene($sceneId: String!) { 
    deleteScene(sceneId: $sceneId) { 
    ok 
    scene { 
     id 
     active 
    } 
    } 
}`; 

const SceneModifierWithStateAndData = compose(
    ..., 
    graphql(DeleteSceneMutation, { 
    props: ({ mutate }) => ({ 
     deleteScene: (sceneId) => mutate({ 
     variables: { sceneId }, 
     updateQueries: { 
      SceneCollections: (prev, { mutationResult }) => { 
      const myScenesList = prev.myScenes.edges.map((item) => item.node); 
      const deleteIndex = _.findIndex(myScenesList, (item) => item.id === sceneId); 
      if (deleteIndex < 0) { 
       return prev; 
      } 
      return update(prev, { 
       myScenes: { 
       edges: { 
        $splice: [[deleteIndex, 1]] 
       } 
       } 
      }); 
      } 
     } 
     }) 
    }) 
    }) 
)(SceneModifierWithState); 
+0

Witam @ vwrobel dzięki za odpowiedź. Chciałbym usunąć resztkę tego rekordu w pamięci podręcznej (używam '$ {type}: $ {id}' dla mojego klucza pamięci podręcznej). Czy to też mogłoby to zrobić? – derekdreery

+0

Witam @ derekdreery. Kiedy używam 'updateQuery', tylko określony kod jest stosowany do poprzednich wyników zapytania. W opublikowanym przeze mnie kodzie jedyną zmianą, którą otrzymuję, jest usunięcie usuniętego elementu z listy SceneCollections.myScenes. Poza tym, jeśli mam inne zapytanie, aby uzyskać 'user {id, sceneCounter}', musiałbym zaktualizować sceneCounter ręcznie z updateQueries: nawet jeśli moje DeleteSceneMutation zwróci zaktualizowany 'user {id, sceneCounter}', inne wyniki zapytania nie są aktualizowane, gdy używam updateQueries. Nie jestem pewien, czy odpowiada na twoje pytanie, moja wiedza apollo jest raczej ograniczona ... – vwrobel

+0

Bez obaw - moja wiedza też jest ograniczona !! – derekdreery

2

Osobiście zwracam numer int, który reprezentuje liczbę usuniętych elementów. Następnie używam updateQueries, aby usunąć dokument (y) z pamięci podręcznej.

+0

Czy możesz podać przykład użycia 'updateQueries' do usunięcia rekordów: szczególnie, gdy znajdują się one w więcej niż jednym miejscu w drzewie. – derekdreery

+0

Czy musisz usunąć go ze wszystkich lokalizacji? – derekdreery

+0

Czy opracowałeś to @derekdreery? Nie wymyśliłem, jak użyć 'updateQueries' do usunięcia elementów – Dunos