首页 > 解决方案 > 将边缘插入中继连接的正确方法是什么?

问题描述

我在中继 paginationContainer 组件中订阅了新记录。当它从后端检索新记录时,我以这种方式将其插入连接中(在updater选项中requestSubscription):

const newEdge = ConnectionHandler.createEdge(
  store,
  connection,
  newPostNode,
  'posts'
)
ConnectionHandler.insertEdgeBefore(connection, newEdge)

当我看到一个新的插入边缘时,它可以正常工作console.log(props.posts.edges)。然而,正如我所料cursor,这个新插入边缘的参数是undefined它的node参数本身就是一个记录。

我认为这是不正确的,因为连接中的每个边都必须有一个cursor.

将新边缘插入中继连接以使其包含 的正确方法是cursor什么?

标签: connectiongraphqlgraphql-jsrelayjsrelay

解决方案


每条边都必须有一个游标,通常应该由服务器提供。这意味着返回可能是边缘一部分的节点的订阅或突变也应该提供游标。

有两种主要方法。如果只能以一种方式对连接进行排序(从而保证同一节点始终具有相同的光标),则可以只返回整个边类型:

type PostEdge {
    node: Post!
    cursor: String!
}

type MyMutationPayload {
    edge: PostEdge!    
}

type Mutation {
    newPost(input: NewPostInput!): MyMutationPayload!
}

如果可以以多种方式对连接进行排序(例如按标题、出版日期、作者),则光标因排序选项而异,这意味着您不能返回边本身,但您可以返回必要的信息来构建客户端更新程序中的边缘:

enum PostSort {
    NEWEST_FIRST
    AUTHOR_AZ
    TITLE_AZ 
}

type PostCursors {
    sortKey: PostSort!
    cursor: String!
}

type MyMutationPayload {
    node: Post!
    cursors: [PostCursors!]!
}

type Mutation {
    newPost(input: NewPostInput!): MyMutationPayload!
}

推荐阅读