Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs 形成由多个组件请求的单个查询_Reactjs_Rest_Graphql_Apollo - Fatal编程技术网

Reactjs 形成由多个组件请求的单个查询

Reactjs 形成由多个组件请求的单个查询,reactjs,rest,graphql,apollo,Reactjs,Rest,Graphql,Apollo,我正在考虑从标准RESTAPI体系结构转移到graphQL。目前我有一个数据包装器,它在初始化后用用户信息和其他元数据预加载数据集 apollo客户端是否有办法构建多个组件请求的单个查询,并在加载组件后将其发送到graphQL服务器,而不是为每个组件发送单独的查询,并形成应用程序运行所需的数据层 有什么其他选项可以做到这一点,并使GraphQL比当前实现更好。假设您有以下GraphQL模式: type Query { question(questionId: Int!): Questio

我正在考虑从标准RESTAPI体系结构转移到graphQL。目前我有一个数据包装器,它在初始化后用用户信息和其他元数据预加载数据集

apollo客户端是否有办法构建多个组件请求的单个查询,并在加载组件后将其发送到graphQL服务器,而不是为每个组件发送单独的查询,并形成应用程序运行所需的数据层


有什么其他选项可以做到这一点,并使GraphQL比当前实现更好。

假设您有以下GraphQL模式:

type Query {
    question(questionId: Int!): Question
    tag(tagId: Int!): Tag
}

type Question {
    questionId: Int!
    content: String!
}

type Tag {
    tagId: Int!
    tagName: String!
}
如果要在一个请求中检索2个对象,可以编写以下qraphql请求:

{
  question(questionId: 1) {
    questionId
    content
  }
  tag(tagId:1){
    tagId
    tagName
  }
}
作为输出,您将收到以下JSON:

{
  "data": {
    "question": {
      "questionId": 1,
      "content": "how to code in js?"
    },
    "tag": {
      "tagId": 1,
      "tagName": "js"
    }
  }
}

Apollo客户端中的查询有一个选项
fetchPolicy
,默认值为
cache first
,这意味着Apollo将在尝试网络提取之前首先尝试从本地缓存读取数据。如果有多个组件请求已经获取的数据,则不会发生网络调用。只要确保在查询中返回请求数据的
id
字段,即使组件没有使用它来确保正确的缓存

这太神奇了,但是如果我直接获取用户,然后获取公司(id:1){users},graphql会明白这是一样的,因为它使用相同的模式吗?是的。缓存基于模式中定义的GraphQL类型进行。在这种情况下,我假设“用户”。