【问题标题】:Get All Pages with an Apollo Query使用 Apollo 查询获取所有页面
【发布时间】:2018-02-20 17:33:39
【问题描述】:

假设我的数据库中有 500 行。我想要 100 页 50 行。这是fetchMore 请求的示例。

const fetchNextPage = (props) => {
  props.Query.fetchMore({
    query: gql(getRows),
    variables: {
      skip: props.Query.rows.length,
    },
    updateQuery: (previousResult, next) => {
      return {
        ...previousResult,
        rows: [...previousResult.rows, ...next.fetchMoreResult.rows],
      };
    },
  });
}

我不确定的是……

  1. 如何在不进行额外用户操作的情况下获取所有页面?
  2. 既然我知道所需页面的总数,我该如何并行发送它们?

【问题讨论】:

    标签: graphql apollo react-apollo


    【解决方案1】:

    您实际上可以通过一次操作来做到这一点。使用aliases,您可以使用不同的参数多次请求同一个字段。

    这里是官方explanation about aliases

    在您的情况下,它类似于:

      query GetAllPages {
          page1rows: rows(skip: 0, limit: 50) { # "skip" and "limit" are just regular variable names
              #...rowFields
          }
          page2rows: rows(skip: 50, limit: 50) {
              #...rowFields
          }
          #... etc.
      }
    

    在此示例中,page1rowspage2rowsrows 字段的别名。您可以选择其他别名。

    请注意,skiplimit 没有什么特别之处,它们是普通变量,它们的使用取决于服务器上的架构和解析器。我在你的代码中看到你使用skip,如果你知道你总是会得到50行那么limit是多余的。

    响应应该是这样的:

    {
      "data": {
        "page1rows": [
          //... rows
        ],
        "page2rows": [
          //... rows
        ],
        //... etc.
      }
    }
    

    这种方式无需额外的用户操作即可工作,您一次获得所有页面,无需使用fetchMore

    【讨论】:

    • 非常感谢塔尔的回答。我遇到的一个问题是响应负载对于一个查询来说太大了。这就是分页响应的原因。
    • 但是如何在 vue-apollo 中实现呢?我总是收到此错误消息:Missing myQuery attribute on result.
    猜你喜欢
    • 1970-01-01
    • 2020-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-20
    • 1970-01-01
    • 2023-03-06
    • 2019-02-24
    相关资源
    最近更新 更多