Apollo Client State - объект, записанный в кеш с writeData, отсутствует - PullRequest
0 голосов
/ 19 февраля 2019

У меня проблема с Apollo Client State в моем приложении React.Я создаю свою ссылку на состояние клиента следующим образом:

const stateLink = withClientState({
  cache,
  defaults: {
    simulation: {
      __typename: 'Simulation',
      configurationName: null,
      job: null,
      status: null,
      uuid: null,
    },
    pageTitle: null,
  },
  resolvers: {},
});

В какой-то момент я должен очистить кэш в приложении (после выхода из системы), который также очищает состояние моего клиента.Я очищаю кеш следующим образом:

client.resetStore()

Где клиент получен с помощью withApollo HOC.После этого я пытаюсь воссоздать свое локальное состояние с помощью следующих вызовов:

client.writeData({
  data: {
    pageTitle: 'test',
  },
});

client.writeData({
  data: {
    simulation: {
      __typename: 'Simulation',
      configurationName: null,
      job: null,
      status: null,
      uuid: null,
    },
  },
});

Но это не работает - в кеше хранится только pageTitle, что приводит к сбою во всех связанных с имитацией состояниях клиента состояниях.запросов.

Кэширование перед очисткой:

{
  "data": {
    "$ROOT_QUERY.simulation": {
      "__typename": "Simulation",
      "configurationName": null,
      "job": null,
      "status": null,
      "uuid": null
    },
    "ROOT_QUERY": {
      "simulation": {
        "type": "id",
        "generated": true,
        "id": "$ROOT_QUERY.simulation",
        "typename": "Simulation"
      },
      "pageTitle": null
    }
  }
}

Кеширование после очистки и восстановления локального состояния:

{
  "data": {
    "ROOT_QUERY": {
      "pageTitle": null
    }
  }
}

Вместо вторых writeData Я также попытался написать запрос:

const SIMULATION_LOCAL_DATA_QUERY = gql`
  {
    simulation @client {
      configurationName
      job
      status
      uuid
    }
  }
`;

client.writeQuery({
  query: SIMULATION_LOCAL_DATA_QUERY,
  data: {
    simulation: {
      __typename: 'Simulation',
      configurationName: null,
      job: null,
      status: null,
      uuid: null,
    },
  },
});

Но это тоже не сработало.Может ли кто-нибудь сказать мне, что я делаю не так?Спасибо!

1 Ответ

0 голосов
/ 19 февраля 2019

При просмотре документов предложенный метод сброса хранилища после выхода из системы клиента заключается в использовании метода writeDefaults, который можно внедрить в качестве обратного вызова в методе onRestStore:

const cache = new InMemoryCache();
const stateLink = withClientState({ cache, resolvers, defaults });

const client = new ApolloClient({
  cache,
  link: stateLink,
});

const unsubscribe = client.onResetStore(stateLink.writeDefaults);

Этоприходит прямо из: https://www.apollographql.com/docs/link/links/state.html

Надеюсь, что помогает.

...