В настоящее время я разрабатываю приложение 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? и как я могу сразу использовать клиентский кеш с мутацией?
Заранее спасибо за помощь!