在使用 Apollo 客户端来处理嵌套查询时,可能会遇到缓存不生效的问题。要解决这个问题,可以使用 Apollo 的 normalize 方法。以下是示例代码:
import { ApolloClient, InMemoryCache, normalize } from '@apollo/client';
import { gql } from '@apollo/client';
// 创建 Apollo 客户端,设置缓存
const client = new ApolloClient({
uri: 'https://my-graphql-api.com/graphql',
cache: new InMemoryCache(),
});
// 发起查询
client.query({
query: gql`
query GetAuthorAndBooks($id: ID!) {
author(id: $id) {
id
name
books {
id
title
}
}
}
`,
variables: {
id: '1',
},
})
.then(result => {
// 取出 author 和 books 字段的数据
const { author, books } = result.data;
// 将 author 和 books 字段的数据规范化
const normalizedData = normalize(result.data, {
Author: (value) => ({
id: value.id,
name: value.name,
books: value.books.map(book => book.id),
__typename: 'Author',
}),
Book: (value) => ({
id: value.id,
title: value.title,
__typename: 'Book',
}),
});
// 将规范化后的数据写入缓存
client.cache.writeNormalizedCache(normalizedData);
console.log(author);
console.log(books);
});
这里的关键是使用 normalize 方法对查询结果进行规范化,然后将规范化后的数据写入缓存。这样,就能确保嵌套查询的缓存生效了。