如何在 pageInfo 中将总数传递给客户端

Posted

技术标签:

【中文标题】如何在 pageInfo 中将总数传递给客户端【英文标题】:How to pass total count to the client in pageInfo 【发布时间】:2016-03-15 12:49:54 【问题描述】:

我用firstafterlastbefore做分页。 hasNextPagehasPreviousPage 非常有用。

但我还需要total count,这样我就可以计算并在客户端显示page 5 of 343 pages之类的内容。

很遗憾,这不是pageInfo 的一部分,尽管我在服务器站点上有信息。

您能否在pageInfo 中包含一个total 字段并扩展connectionFromArray 以获取arrayLength 的总数,就像connectionFromArraySlice 一样?

谢谢

【问题讨论】:

【参考方案1】:

我在连接上使用了一段时间的自定义totalCount 字段,但它引入了我一开始没有看到的复杂性(在突变后更新连接时,如果你想更新它,你必须使用相同的 args 查询它自动)。

因此,我回到每个连接旁边都有一个count 字段。在您的示例中,这意味着:

fragment on TodoList 
  taskCount
  tasks 
    edges  ... 
  

我创建了一个为我创建它的小助手:https://github.com/rea-app/relay-connection-count

【讨论】:

我不知道 Relay,但在 Apollo 中你会使用 @connection 指令从缓存键中排除 limitoffset 等参数:apollographql.com/docs/react/data/pagination/… 这个!当您在pageInfoedges 旁边的连接中拥有totalCount 时,它会产生很多复杂性。如果用户只查询taskCount,您可能不想查询分页任务的分贝。所以你需要将它们分开。您当然可以检查edgespageInfo 是否被查询,但大多数时候并不是那么简单。如果您查看来自 GitHub 的 withspectrum/spectrum 架构或 Shopify 的 Admin API,您会发现它们使用了完全相同的方法。可能是为了将事情分开并简化事情。【参考方案2】:

谢谢@Joe Savona

他是完全正确的。由于我花了一点时间才弄清楚如何将属性实际添加到服务器站点上的连接中,我想我也在这里分享一下:

var connectionType: postsConnection = connectionDefinitions(
  name: 'post',
  nodeType: qlPost,
  connectionFields: () => (
    totalCount: 
      type: GraphQLInt,
      resolve: (connection) => connection.totalCount,
      description: `A count of the total number of objects in this connection, ignoring pagination.
This allows a client to fetch the first five objects by passing "5" as the
argument to "first", then fetch the total count so it could display "5 of 83",
for example.`
    
  )
);

希望对其他人有所帮助。

干杯

【讨论】:

感谢您发布此信息。您是如何为 connection.totalCount 赋值的?我的项目布局有点不同,我无法找到合适的位置来填充该值 ***.com/questions/38307845/…【参考方案3】:

pageInfo 旨在表示有关特定页面的信息,而项目总数实际上是连接本身的属性。我们建议在连接中添加一个count 字段。您可以通过以下方式查询它:

fragment on TodoList 
  tasks(first: 10) 
    count # <-- total number of tasks
    edges  ... 
    pageInfo  ... 

Relay 支持连接上的任意字段,因此您可以随意命名为 counttotalCount 等。

【讨论】:

以上是关于如何在 pageInfo 中将总数传递给客户端的主要内容,如果未能解决你的问题,请参考以下文章

在 node/express + ejs 中将对象传递给客户端?

分页库 3.0:如何将项目总数传递给列表标题?

在 Django 中将参数传递给 websocket

如何将 :new 作为参数传递给 oracle 客户函数?

如何在django中将多个参数传递给url

如何在谷歌云构建中将参数传递给 docker run