有关中继连接元素的更多信息

More info on an element of a relay connection

我正在使用 Relay 和 Graphql,我很难弄清楚如何在连接中的一个对象上获取更多字段。

假设我们有以下查询来填充查看者的任务列表:

viewer {
  id
  tasks(first:10) {
    edges {
      node {
        id
        name
      }
    }
  }
}

当用户随后在列表中选择一个时,我想获取所选的更多字段。

这是我的想法:

  1. 我在名为 "task" 的查看器对象上实现了一个新的 field/method,它将一个 id 作为输入,return 只是一个任务。喜欢这个答案:
  2. 使用节点根查询来获取丢失的数据。 (我不确定如何在中继中执行此操作。我是否使根容器依赖于两个查询?)
  3. 使连接接受 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 });