React Relay:复杂的突变脂肪查询

Posted

技术标签:

【中文标题】React Relay:复杂的突变脂肪查询【英文标题】:React Relay: Complex mutation fat query 【发布时间】:2016-11-06 15:08:54 【问题描述】:

我正在创建一个投票应用程序,其中包含可以投票的投票。我目前正忙于投票(本质上是创建投票)。

我的架构:

(长话短说:民意调查可以从主商店访问,但观众的投票和投票可以由他直接访问(作为字段)。投票也可以从最小商店访问,但投票的投票也可以访问直接通过它。

query 
  store 
    polls  //poll connection
      edges 
        node  //poll
          votes  //vote connection
            ...
          
        
      
    
    votes  //vote connection
      edges 
        node  //vote
          ...
        
      
    
  
  viewer 
   polls  //poll connection
      edges 
        node  //poll
          votes  //vote connection
            ...
          
        
      
    
    votes  //vote connection
      edges 
        node  //vote
          ...
        
      
    
  

这个复杂的架构让我不知道应该如何定义我的胖查询,因为它应该定义所有可能发生变化的东西。

以下是可以改变的:

    已创建投票(因此在 fat 查询中为 voteEdge)。 投票已添加到存储下的投票连接。 投票已添加到查看器下的投票连接。 在 store 下的 polls 连接中的某个 poll 下的 votes 连接中添加了一个投票。 (仅当查看者也是投票的创建者时才有可能):在查看器下的投票连接中的某个投票下的投票连接中添加投票。

所以我的问题是我应该如何在我的胖查询中表达这一点,这样就足够了吗?

getFatQuery() 
    return Relay.QL`
      fragment on CreateVoteMutation 
        voteEdge,
        viewer
          polls,
          voteCount
          votes,
        ,
        store
          polls,
          voteCount,
          votes,
        
      
    `;
  

或者我应该以某种方式将投票包括在民意调查中?

getFatQuery() 
    return Relay.QL`
      fragment on CreateVoteMutation 
        voteEdge,
        viewer
          polls
            edges
              node
                voteCount,
                votes
              
            
          ,
          voteCount
          votes,
        ,
        store
          polls
            edges
              node
                voteCount,
                votes
              
            
          ,
          voteCount,
          votes,
        
      
    `;
  

谢谢!

【问题讨论】:

【参考方案1】:

看来你的想法是对的。在 Relay 中定义 FatQuery 时,应尽可能保持返回字段最佳,因为这是 GraphQL 的好处(您不需要返回超过在客户端中使用的内容)。所以你的 FatQuery 应该是这样的:

getFatQuery() 
    return Relay.QL`
      fragment on CreateVoteMutation 
        voteEdge,
        viewer
          polls  // this is most likely a GraphQL object type, so you'll need a sub-selection, but you don't necessarily need to return all the Votes again since you do that later
            name
            timestamp
          
          voteCount // scalar integer
          votes  // again, here you'll need to return a sub-selection since Votes is a GraphQL object type
            name
            timestamp
          
        ,
        store
          polls  // this is most likely a GraphQL object type, so you'll need a sub-selection, but you don't necessarily need to return all the Votes again since you do that later
            name
            timestamp
          
          voteCount // scalar integer
          votes  // again, here you'll need to return a sub-selection since Votes is a GraphQL object type
            name
            timestamp
          
        
      
    `;
  

这个想法是,从技术上讲,您可以再次返回 votes 作为 polls 的子选择;但是,没有必要,因为您 return 已经在查看器下。这将为您提供系统中的总票数和所有票数。如果您想按投票过滤 Votes 和 VoteCount,那么您可以执行相反的操作,如下所示:

getFatQuery() 
    return Relay.QL`
      fragment on CreateVoteMutation 
        voteEdge,
        viewer
          polls  // this is most likely a GraphQL object type, so you'll need a sub-selection, but you don't necessarily need to return all the Votes again since you do that later
            name
            timestamp
            voteCount // scalar integer
            votes  // again, here you'll need to return a sub-selection since Votes is a GraphQL object type
                name
                timestamp
            
          
        ,
        store
          polls  // this is most likely a GraphQL object type, so you'll need a sub-selection, but you don't necessarily need to return all the Votes again since you do that later
            name
            timestamp
            voteCount // scalar integer
            votes  // again, here you'll need to return a sub-selection since Votes is a GraphQL object type
              name
              timestamp
            
          
        
      
    `;
  

希望这会有所帮助!

【讨论】:

再次感谢,我不明白的一件事:我认为中继胖查询中的重点是定义执行突变后可以更改的所有数据。那么您如何在答案中给出的选项之间进行选择,每个选项都只显示部分可能会改变的东西,我错过了什么吗? 是的,关键是为它提供它应该更改的所有数据的上下文,但仅在您需要时提供。您可以使用 Relay 的 getOptimisticResponse 提供一个压缩查询,该查询将从缓存存储中加载以提高性能,而 getFatQuery 是您最终希望为您的应用程序提供的整体查询。不必是整个类型和子字段。

以上是关于React Relay:复杂的突变脂肪查询的主要内容,如果未能解决你的问题,请参考以下文章

React Relay 更新根查询作为突变胖查询的一部分

React-relay 嵌套突变后未获得有效负载

中继/路由器登录突变?

RelayMutation 期望 prop 是 Relay 获取的数据,向查询添加突变不起作用

GraphQL/Relay Schema 无法在“CreateLinkPayload”类型上查询字段“store”

中继:有条件地在突变的胖查询中包含字段