根据使用graphQL的基于连接的分页模型,我具有以下简化模式。
type User {
id: ID!
name: String!
}
type UserConnection {
totalCount: Int
pageInfo: PageInfo
edges: [UserEdge]
}
type UserEdge {
cursor: String
node: User
}
type PageInfo {
lastCursor: Int
hasNextPage: Boolean
}
type Query {
users(first: Int, after: String): UserConnection
}
在SPA前端中考虑以下路由器:
/users
-用户点击此页面后,我将从列表的顶部开始获取前10条记录,此外,我还可以通过重新使用从第一反应。
/user/52
-在这里我想显示10条记录,这些记录应该从user52的位置开始。
问题有哪些可能的方法可以在首次请求时检索记录的特定子集?此时此刻,我没有任何光标可以构造类似于
的东西 query GetTenUsersAfter52 {
users(first: 10, after: "????") { # struggling to pass anything as a cursor...
edges {
node {
name
}
}
}
}
我已经尝试过的(一种可能的解决方案)是,我知道在后端,游标是数据库中记录的_id
的编码值。因此,在/users/52
上,我可以针对该特定用户发出单个请求,获取id
的值,然后在前端,我可以计算一个游标并将其传递给后端上面的查询。
但就个人而言,我发现了两个缺点:
users
查询字段而为单个用户创建另一个查询字段。答案 0 :(得分:1)
这是如何限制中继样式分页的一个很好的例子。使用create突变会遇到类似的情况,在这种情况下,将创建的对象手动添加到缓存中最终会搞砸您的分页,因为您没有用于创建的对象的光标。
只要您实际上并未使用中继客户端,一种解决方案就是完全放弃使用游标。您可以保留before
和after
字段,但只接受id
(或_id
或任何PK)值而不是光标。这就是我最近在一个最近的项目中所做的事情,它大大简化了工作。