graphql - Graphql 拉取数据进行分页
问题描述
我有以下架构
User {
username: String!
name: String!
posts(page: Int!): [Post]
}
Post {
title: String!
description: String
}
并在查询
type Query {
user(username: String!): User
}
在我定义的解析器中Query -> user
,user -> posts
当我提取我使用的数据时:
{
user(username: 'pewpewlasers'){
username
name
posts(page: 1){
title
description
}
}
}
它工作得很好。现在我的问题是如何在无限滚动的情况下有效地拉第二页(最后加载更多按钮)。我可以使用:
{
user(username: 'pewpewlasers'){
username
name
posts(page: 2){
title
description
}
}
}
但是再次吸引用户似乎没有必要,我只需要发布更多内容。是否有内置方式 graphql 处理这个?还是我必须定义一个单独的posts(page: Int!, username: String!)
查询
解决方案
有几种方法可以解决这个问题:
- 创建一个中间类型,例如
UserRelations
专门用于为这些类型的查询提供入口点,而无需通过用户。这是最简单的方法,我以前也做过,但是用这种方式来搞乱数据建模感觉很讨厌。 - 做到这一点,以便每当您解析 a 时
User
,您都会检查正在请求哪些字段。如果您只要求不需要加载用户的字段(即仅关系),请返回一个虚拟对象而不是获取数据。这涉及更多,因为这意味着查看解析器中的字段 AST,但熟悉这一点是使用 GraphQL 进行大多数性能优化的关键。
推荐阅读
- java - 如果在 Thymeleaf 中使用 AND/OR
- flutter - 等待小部件加载其组件
- javascript - 无法在 React 中导入类
- java - 如何从java中的字符串中删除\"?
- sonarqube - 使用 SonarQube Web API 检索条件覆盖信息
- mysql - SQL 为每个 userID 记录计数一个值,除非 userId 的一个记录值为 x
- python - 从具有精确单词匹配的句子列表中获取句子:Python
- javascript - 选择加选项下拉列表播放音频文件
- facebook - Facebook 返回“此网页包含被阻止的 URL”
- javascript - 视频播放,然后由带有链接的静止图像覆盖 onended()