ApolloClient: различное поведение client.writeData и client.mutate - PullRequest
0 голосов
/ 15 января 2019

В настоящее время я разрабатываю приложение React Native с "apollo-client": "^ 2.4.7" и "expo": "^ 32.0.0" и борюсь с различным поведением между client.writeData и client.mutate, когда сохранение значения в локальном кэше клиента Apollo.

Когда я пишу кеш напрямую, используя client.writeData, он будет немедленно сохранен в кеш:

async onBarCodeRead({ type, data } ) {
  await this.props.client.writeData({ data: { scannedEan: data } });
}

и может отображаться в компоненте после перенаправления на другой экран (реагировать-навигация).

componentDidMount() {
  this.focusListner = this.props.navigation.addListener(
    'didFocus',
    () => {
      const { error, data } = await this.client.query({
        query: PICKING_ORDER,
        fetchPolicy: 'cache-only',
      });
      console.log(`ScannedEan : ${data.scannedEan}`);
    },
  );
}

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

async onBarCodeRead({ type, data } ) {
  this.props.client.mutate({
    mutation: gql`
      mutation updateScannedEan($scannedEan: String) {
        updateScannedEan(scannedEan: $scannedEan) @client
      }
    `,
    variables: {
      scannedEan: data,
    },
    refetchQueries: [`PICKING_ORDER`],
  });
}

Мутация определяется в корне App.tsx как:

this.client = new ApolloClient({
    withClientState({
      cache,
      defaults: {},
      typeDefs: `
        type scannedEan: String
        type Mutation {
          updateScannedEan(scannedEan: String)
        }
        type Query {
          scannedEan: String
        }
      `,
      resolvers: {
        Mutation: {
          updateScannedEan: async (_, { scannedEan }, { cache, getCacheKey }) => {
            await cache.writeData({ data: { scannedEan } });
            return null;
          },
        },
      }
    }),
  cache
});

Я пытался добавить refetchQueries к мутации, но запрос не обновился.

В чем разница между мутацией и client.writeData? и как я могу сразу использовать клиентский кеш с мутацией? Заранее спасибо за помощь!

...