如何使用GraphQL变体对列表中的项进行重新排序并更新多个对象? 我正在使用的堆栈 作为我的GraphQL服务器 在客户端 用于处理拖放的库 我想做什么

如何使用GraphQL变体对列表中的项进行重新排序并更新多个对象? 我正在使用的堆栈 作为我的GraphQL服务器 在客户端 用于处理拖放的库 我想做什么,graphql,apollo,scaphold,Graphql,Apollo,Scaphold,我正在构建一个向用户显示多个列表的应用程序,每个列表都包含多张卡片。在列表中,用户可以对卡片重新排序。还可以将卡从一个列表移动到另一个列表,从而更改卡的父列表以及源列表和目标列表中的卡顺序 这是一个GIF,显示了我的应用程序中卡片/列表和重新排序的UI。您在这里看到的都是客户端发生的,更改不会持久化到数据库: 这是我用来构建UI的查询: const foo = gql` query foo { getAccount(id: "xxxxx") { cardLists {

我正在构建一个向用户显示多个列表的应用程序,每个列表都包含多张卡片。在列表中,用户可以对卡片重新排序。还可以将卡从一个列表移动到另一个列表,从而更改卡的父列表以及源列表和目标列表中的卡顺序

这是一个GIF,显示了我的应用程序中卡片/列表和重新排序的UI。您在这里看到的都是客户端发生的,更改不会持久化到数据库:

这是我用来构建UI的查询:

const foo = gql`
  query foo {
    getAccount(id: "xxxxx") {
      cardLists {        
        edges {
          node {
            id
            name
            cards(orderBy: {field: order, direction: ASC}) {
              edges {
                node {
                  id
                  name
                  order
                }
              }
            }
          }
        }
      }
    }
  }
`
下面是一个来自Vue Dragable项目的GIF,它进一步说明了我在做什么(请注意数据中的“order”值):


问题 我不知道如何构建一个变异来处理重新排序,这样移动的卡片,以及对源列表和目标列表的排序所做的更改,都能正确地持久化

在Scaphold中构建模式意味着我需要(我认为)使用它提供的突变。我看不到一种方法可以将多张卡片和列表传递给一个变种,这样我就可以一次更新所有内容

以下是Scaphold.io中示例项目的端点:

下面是Scaphold.io生成的模式:


我的问题
  • 在GraphQL中持久化这样的更改的正确方式是什么
  • 鉴于Scaphold的约束和固执己见的行为,我的突变应该如何进行

我不知道Scaphold的情况,但您可以将所有项目保留在一个数组中,并始终在一次变异中更新,也可以逐个更新列表项目

实现非耦合手动排序的最简单方法是设置一个
顺序:Float
字段,每次您要在两张其他卡片之间移动卡片时,将该字段设置为
(prev.order+next.order)/2
,或者如果您移动到后面/前面,则设置为比上一张/第一张多/少


给定浮点精度,在精度下降之前,您可以在相同的两张卡之间执行53次此操作,此时您可以重新分配
顺序
字段,或手动将有问题的卡上下移动

“但您可以将所有项目保留在一个数组中,您总是在一次变异中更新这些项目,或者您可以逐个更新列表项目。”-谢谢。对于新手的问题,很抱歉,但这样的查询是什么样子的?谢谢w00t,不幸的是,我似乎无法配置Scaphold变异以接受卡片输入列表。