有关中继连接元素的更多信息
More info on an element of a relay connection
我正在使用 Relay 和 Graphql,我很难弄清楚如何在连接中的一个对象上获取更多字段。
假设我们有以下查询来填充查看者的任务列表:
viewer {
id
tasks(first:10) {
edges {
node {
id
name
}
}
}
}
当用户随后在列表中选择一个时,我想获取所选的更多字段。
这是我的想法:
- 我在名为 "task" 的查看器对象上实现了一个新的 field/method,它将一个 id 作为输入,return 只是一个任务。喜欢这个答案:
- 使用节点根查询来获取丢失的数据。 (我不确定如何在中继中执行此操作。我是否使根容器依赖于两个查询?)
- 使连接接受 id 输入,然后仅 return 那个任务。
现在 1. 似乎违背了整个 "graph" 模型思维,添加了一个 "function" 来获取一个元素到图中。
对于第 2 个问题,我不太确定使用节点根查询是一个好的做法,因为它似乎是一个内部中继的东西?
我不知道数字 3 是否是一个可行的解决方案,因为它是一种筛选可能对列表视图有影响的列表?
更新
我们最终为每个连接创建了一个字段,该字段将 id 作为输入和 returns 列表中的一个元素。这是受到 Graphcool、GitHub 和其他人在他们的端点上这样做的方式的启发。感谢您为我指明正确的方向。
你的第二种方法实际上在official Relay docs中提到了。
对于您的情况,您可以像这样针对特定任务进行额外查询:
query SpecificNode {
node(id: "task-id") {
id
... on Task {
name
# more fields
}
}
}
Graphcool 的中继 API 包括对 fetch one node of a specific model 的额外顶级查询。您的案例查询如下所示:
query SpecificTask {
Task(id: "task-id") {
id
name
# more fields
}
}
你可以在 @include
指令的帮助下做到这一点。中继会处理一切!
假设你已经将 task
设计为一个单独的 React 组件,导出的 Relay 容器将如下所示:
export default Relay.createContainer(Task, {
initialVariables: {
taskSelected: false,
},
fragments: {
viewer: () => Relay.QL`
fragment on Viewer {
id
tasks(first:10) {
edges {
node {
id
name
additionalInfo @include(if: $taskSelected) {
where,
when,
who,
priority
}
}
}
}
}
`,
},
});
additionalInfo
的获取是通过使用 @include(if: $taskSelected)
有条件的,其中 taskSelected
是一个中继变量并在 initialVariables
属性 下初始化。当查看者选择任务以获取更多信息时,将 taskSelected
设置为 true :
this.props.relay.setVariables({ taskSelected: true });
我正在使用 Relay 和 Graphql,我很难弄清楚如何在连接中的一个对象上获取更多字段。
假设我们有以下查询来填充查看者的任务列表:
viewer {
id
tasks(first:10) {
edges {
node {
id
name
}
}
}
}
当用户随后在列表中选择一个时,我想获取所选的更多字段。
这是我的想法:
- 我在名为 "task" 的查看器对象上实现了一个新的 field/method,它将一个 id 作为输入,return 只是一个任务。喜欢这个答案:
- 使用节点根查询来获取丢失的数据。 (我不确定如何在中继中执行此操作。我是否使根容器依赖于两个查询?)
- 使连接接受 id 输入,然后仅 return 那个任务。
现在 1. 似乎违背了整个 "graph" 模型思维,添加了一个 "function" 来获取一个元素到图中。
对于第 2 个问题,我不太确定使用节点根查询是一个好的做法,因为它似乎是一个内部中继的东西?
我不知道数字 3 是否是一个可行的解决方案,因为它是一种筛选可能对列表视图有影响的列表?
更新
我们最终为每个连接创建了一个字段,该字段将 id 作为输入和 returns 列表中的一个元素。这是受到 Graphcool、GitHub 和其他人在他们的端点上这样做的方式的启发。感谢您为我指明正确的方向。
你的第二种方法实际上在official Relay docs中提到了。
对于您的情况,您可以像这样针对特定任务进行额外查询:
query SpecificNode {
node(id: "task-id") {
id
... on Task {
name
# more fields
}
}
}
Graphcool 的中继 API 包括对 fetch one node of a specific model 的额外顶级查询。您的案例查询如下所示:
query SpecificTask {
Task(id: "task-id") {
id
name
# more fields
}
}
你可以在 @include
指令的帮助下做到这一点。中继会处理一切!
假设你已经将 task
设计为一个单独的 React 组件,导出的 Relay 容器将如下所示:
export default Relay.createContainer(Task, {
initialVariables: {
taskSelected: false,
},
fragments: {
viewer: () => Relay.QL`
fragment on Viewer {
id
tasks(first:10) {
edges {
node {
id
name
additionalInfo @include(if: $taskSelected) {
where,
when,
who,
priority
}
}
}
}
}
`,
},
});
additionalInfo
的获取是通过使用 @include(if: $taskSelected)
有条件的,其中 taskSelected
是一个中继变量并在 initialVariables
属性 下初始化。当查看者选择任务以获取更多信息时,将 taskSelected
设置为 true :
this.props.relay.setVariables({ taskSelected: true });