对于嵌套连接,如何在getConfigs 中定义parentName、parentId 和connectionName?

How do you define parentName, parentId, and connectionName in getConfigs for a nested connection?

我 运行 遇到了在嵌套连接上编写中继突变的一些问题。这是类型结构:

{ 
  viewer { 
    entity(id) { 
      events // mutate connection here
    }
  }
} 

在 getConfigs 中,我有指向 "viewer" 的 parentName 和 parentID,但是 connectionName "events" 在查看器上不存在,它存在于 "entity" 类型上。

正如您将在下面的代码片段中看到的,我也不确定如何在 getFatQuery 中使用变量来获取具有实体 ID 的变异数据。

getConfigs 和 getFatQuery:

     getConfigs() {
        return [{
          type: 'RANGE_ADD',
          parentName: 'viewer',
          parentID: this.props.viewer.id,
          connectionName: 'events',
          edgeName: 'eventEdge',
          rangeBehaviors: {
            '': 'append'
          },
        }];
      }

      getFatQuery() {
        return Relay.QL`
          fragment on addEventPayload {
            viewer {
              entity(id: $entityId) // how do I use variables in the getFatQuery {
                events(first: 20) {
                  edges {
                    node {
                      status
                    }
                  }
                }
              }
            },
            eventEdge
          }
        `;
      }

如果我的问题没有任何意义,我非常乐意帮助澄清,所以请随时提出有关我的问题的问题。

感谢您的帮助!

对于将来遇到此问题的任何人,您不必担心再次传递 id 或处理嵌套 queries/fields。中继将只查找并更新客户端上的适当记录。 This issue on Github 对解决这个问题很有帮助,尤其是来自 freiksenet 的评论。

在上面的示例中 - 我们没有通过 viewer,而是直接进入 entity

输出字段:

  outputFields: {
    eventEdge: {
      type: eventEdge,
      resolve: async({event}) => {
        const eventsByOwner = await Event.getEventsByOwnerId(event.ownerId)
        const eventIndex = eventsByOwner.findIndex(evt => evt.id == event.id);
        const cursor = offsetToCursor(eventIndex);
        return {
          cursor: cursor,
          node: event
        };
      }
    },
    entity: {
      type: entity,
      resolve: async({event}) => {
        return Entity.getEntity(event.ownerId)
      }
    },
  }

getConfigs 和 getFatQuery:

getConfigs() {
    return [{
      type: 'RANGE_ADD',
      parentName: 'entity',
      parentID: this.props.entityId,
      connectionName: 'events',
      edgeName: 'eventEdge',
      rangeBehaviors: {
        '': 'append'
      },
    }];
  }

  getFatQuery() {
    return Relay.QL`
      fragment on addEventPayload @relay(pattern: true) {
        entity {
          events
        },
        eventEdge
      }
    `;
  }

注意:使用 @relay(pattern: true) 将确保您不会 运行 在不为连接查询传递参数时出现问题,并且会回退到您上次的此类查询。