在 React 中渲染 Relay 现代片段

Posted

技术标签:

【中文标题】在 React 中渲染 Relay 现代片段【英文标题】:Rendering Relay Modern Fragments in React 【发布时间】:2018-03-20 13:02:15 【问题描述】:

我似乎无法让“计数”数据显示在 UI 中。我确定我错过了在同一个容器中使用两个片段或渲染边缘数组或异步的东西,也许。 除了this.props.link.votes.count 之外的所有其他数据都在显示,它在 UI 中显示为空,而在开发工具中的服务器或客户端上没有抛出任何错误。它只是没有出现。 任何帮助将不胜感激。谢谢。

react 组件如下所示:

       <div className="f6 lh-copy gray">
        " "
        this.props.link.votes.count votes | by " "
        this.props.link.postedBy
          ? this.props.link.postedBy.name
          : "Unknown"" "
        timeDifferenceForDate(this.props.link.createdAt)" "
      </div>" "

我有这个工作的 graphql 查询,它可以在 graphiql 中提取正确的数据。


  links(first: 20) 
    pageInfo 
      hasPreviousPage
      hasNextPage
    
    edges 
      node 
        id
        url
        description
        votes 
          ...Link_votes
        
      
    
  


fragment Link_votes on VoteConnection 
  edges 
    cursor
    node 
      count
    
  

这是输出


  "data": 
    "links": 
      "pageInfo": 
        "hasPreviousPage": false,
        "hasNextPage": false
      ,
      "edges": [
        
          "node": 
            "id": "TGluazo1OWRiNDc4ODY5YmJkOTViOWY2YzVkMGY=",
            "url": "afasfdasf",
            "description": "adasdf",
            "votes": 
              "edges": [
                
                  "cursor": "YXJyYXljb25uZWN0aW9uOjA=",
                  "node": 
                    "count": "3"
                  
                
              ]
            
          
        
      ]
    
  

在我的 Link.js 组件中,我有这些片段与上述 graphql 调用重复

createFragmentContainer(


Link,
  graphql`
    fragment Link_votes on VoteConnection 
      edges 
        cursor
        node 
          count
        
      
    
  `
);

export default createFragmentContainer(Link, 
  link: graphql`
    fragment Link_link on Link 
      id
      description
      url
      createdAt
      postedBy 
        id
        name
      
      votes 
        ...Link_votes
      
    
  `
);

完整的 Link.js 文件在 gist 中。

所以这个想法是,考虑到“链接”节点的结构,这应该可行:

this.props.link.votes.edges[0].node.count

'link' 在 graphql 响应中为您提供您所在的链接。 'votes' 为您提供 votes 键,该键具有一组边,该数组始终只返回数组中包含投票计数结果的一个对象。因此,您希望该数组中的索引 0 为

` "cursor": "YXJyYXljb25uZWN0aW9uOjA=",
   "node":  
      "count": "3"
   
 `

如果我们想要索引 0 上的节点属性,我们使用点表示法,那么对象上的 count 属性键也是如此。这是行不通的。

【问题讨论】:

【参考方案1】:

这是有效的。

solution was to remove the Link_votes fragment container
```
createFragmentContainer(
  Link,
  graphql`
    fragment Link_votes on VoteConnection 
      edges 
        cursor
        node 
          count
        
      
    
  `
);
```

在链接片段中,直接使用投票,

```
votes 
   edges 
      node 
         count
      
   

```

我认为这是一个过度思考的案例。我会把它留在这里,以防它对任何人有帮助。

【讨论】:

以上是关于在 React 中渲染 Relay 现代片段的主要内容,如果未能解决你的问题,请参考以下文章

使用具有不同片段字段的相同中继根查询的多个 react-router-relay 路由

使用 Relay 和 React-Native 时的条件片段或嵌入的根容器

从外部存储中检索 Relay 查询片段的变量

从 Relay 中的动态组件获取片段

Relay Modern 节点不包含片段属性

中继现代片段错误(期望对象包含数据....)