如何在apollo graphql reactjs中使用去目标化查询?

如何在apollo graphql reactjs中使用去目标化查询?,reactjs,graphql,apollo,Reactjs,Graphql,Apollo,假设data-是来自父查询的数据 子反应组件: const ShowDetails = ({data}) => { const { loading, error, data_details } = useQuery(someQueryAsksAdditionalFileldsForEntryAlreadyPresentInCache); } SomeQueryAsksAdditionalFileLdsForentryReadyPresentInCache——请求数据中缺少的其他字段

假设
data
-是来自父查询的数据

子反应组件:

const ShowDetails = ({data}) => {
   const { loading, error, data_details } = useQuery(someQueryAsksAdditionalFileldsForEntryAlreadyPresentInCache);
}
SomeQueryAsksAdditionalFileLdsForentryReadyPresentInCache
——请求
数据中缺少的其他字段

(!loading&&!error)
数据详细信息
将包含请求的字段

问题:
data\u details
将只包含请求的字段

问题:是否有方法将父数据与ShowDetails中合并的其他请求字段一起使用,并忽略
数据\u详细信息

在Chrome中,在Apollo开发工具的帮助下,我看到Apollo缓存有一个来自合并的
data
data\u details
的条目

我不想重新获取
数据中的所有现有条目

例如:

父组件查询:

const bookQuery = gql`
  query ($bookId: ID!) {
    book(id: $bookId) {
      id
      author
    }
  }
`
详情查询:

const bookEditionsQuery = gql`
  query ($bookId: ID!) {
    book(id: $bookId) {
      id
      editions {
        publisher
        year
      }
    }
  }
`
所有这些查询都将使用
id
填充阿波罗缓存中的同一个bucket:
book

需要实现的内容:在react component
BookDetails
中:

具有1个对象,其中包含:

data.author
data.editions[0].年份
数据。查看[0]。用户

逻辑上-这是缓存中的一个条目


感谢您的帮助。

使用已获取[并从父级传递]的数据几乎无需保存任何内容。。。仅
作者
。。。必须获取所有审阅和编辑,根本不使用缓存

。。。通过
book
resolver获取
review
editions
,有助于apollo cache保持关系,但也需要API使用额外的('book')resolver[level],而这不是必需的。。。review和editions解析器应该可以使用图书id直接调用。。。和f.e.可由单独的
子组件使用。。。或者使用相同的id参数在一个请求中调用
review
editions

只需在组件中分别使用
数据
数据详细信息
——避免代码复杂化,使其易于阅读:

const ShowDetails = ({data}) => {
   const { loading, error, data:dataDetails } = useQuery(someQueryAsksAdditionalFileldsForEntryAlreadyPresentInCache);
}
if(loading) return "loading...";
return (
  <div>
    <div>author: {data.author}</div>
    {dataDetails.review.map(...

无需合并/从父级传递。。。仅使用cache only policy查询所有必需字段这与链接中的@xadm:quote一致:在触发graphql查询时可以使用不同的获取策略。当fetch policy设置为fetchPolicy时:“仅缓存”。您的意思是,此获取策略避免发出任何网络请求。如果您要查询的数据在缓存中不可用,它将抛出一个错误。我认为
先缓存
也不会有帮助:如果缓存缺少您请求的一些数据,Apollo将根据查询向您的API发出网络请求-这意味着重新获取所有字段。如果缓存中没有所有字段,则可以使用OnCompleted合并合并两个数据并不容易。这两个查询
parent
+
details
可以有一组特定的字段。示例父项有:{book{author}}详细信息{query{book{editions{year}}}。用同一组关键点合并两个对象并不容易。
const ShowDetails = ({data}) => {
   const { loading, error, data:dataDetails } = useQuery(someQueryAsksAdditionalFileldsForEntryAlreadyPresentInCache);
}
if(loading) return "loading...";
return (
  <div>
    <div>author: {data.author}</div>
    {dataDetails.review.map(...
const ShowDetails = ({data}) => {
   const [bookData, setBookData] = useState(null);
   const { loading, error, data:dataDetails } = useQuery(someQueryAsksAdditionalFileldsForEntryAlreadyPresentInCache, {
    onCompleted: (newData) => {
        setBookData( {...data, ...newData } );
      }
    });
    if(bookData) return ...
      // {bookData.author}
      // bookData.review.map(...