中继 createFragmentContainer 的现代目的

Posted

技术标签:

【中文标题】中继 createFragmentContainer 的现代目的【英文标题】:Relay Modern purpose of createFragmentContainer 【发布时间】:2017-12-06 16:39:01 【问题描述】:

我一直在尝试 relay-modern 一段时间,我想知道createFragmentContainer 的目的是什么,而不仅仅是描述应该的片段> 属于Component

例如这就是文档显示它应该是如何的方式

Parent.js

<QueryRenderer
  render=(error, props) => 
    if (error || props) 
       return <Child someData=someData>
    
    return <div>Loading</div>
  

  query=graphql`
    query SomeQuery($id: ID!) 
      endpoint(id: $id) 
        ...Child_someData
      
    
  `
/>

Child.js

export default createFragmentContainer( 
  (someData) => <header>someData.title - someData.name</header>,
  graphql`
    fragment Child_someData on EndPoint 
       title
       name
    
  `
)

但不是以这种方式执行Child.js,我可以将带有查询的组件重写或拆分为 2 个不同的文件,如下所示:

ChildComponent.js

export default (someData) => <header>someData.title - someData.name</header>

Child.js

export default graphql`
  fragment Child_someData on EndPoint 
    title
    name
  
`

它仍然可以工作(Parent.js 仍然可以识别片段)。所以这让我想知道createFragmentContainer 是否只是为了让语法糖更整洁。

如果有人能用这个来点亮它,那就太棒了!在documentation 中找不到这么多关于此的内容

【问题讨论】:

只是为了重温一下,我发现如果我使用QueryRenderer使用createFragmentContainer,传递的道具将无法作为真实数据使用取而代之的是,中继将使用某种结构从存储中查找数据。因此,根据我的观察,如果我使用的是QueryRenderer,我将需要createFragmentContainer 【参考方案1】:

你的例子是一个相当静态的实现......我认为你需要考虑的是这些是提供额外功能的容器,fragmentContainer 是更抽象的层之一。

我会更多地研究 refetchContainer 和 paginationContainer 如何扩展 fragmentContainer 的概念,并查看 Github 存储库本身,

https://github.com/facebook/relay/blob/master/packages/react-relay/modern/ReactRelayFragmentContainer.js

因此,子容器当然可以只是一个包含要导出的片段的文件,但理想情况下,您应该将它们视为容器,它们是 React 组件的扩展。它们是冒泡到组合查询中的容器片段,为您在 React 上下文中管理状态提供了便利。

【讨论】:

【参考方案2】:

中继编译器将找到您的Child.js 文件,因此将创建片段并获取您的查询。 但是,不同之处在于 createFragmentContainer 是一个 HOC,Relay 使用它来保证组件在所有必要数据可用之前不会渲染。这就是FragmentContainer 的目的,这就是你应该使用它的原因。

【讨论】:

以上是关于中继 createFragmentContainer 的现代目的的主要内容,如果未能解决你的问题,请参考以下文章

水合没有查询的中继片段

中继:在 Fragment 中使用常量而不是 graphql`...`

什么是中继中继的分类

中继(洪泛中继定向中继)在无线通讯中的应用

Axure中继器的使用

【Axure10】 交互功能-交互动作-中继器动作