javascript - 中继 createFragmentContainer 的现代用途

标签 javascript relayjs graphql-js relaymodern

我尝试 relay-modern 有一段时间了,我想知道 createFragmentContainer 除了描述 的片段之外还有什么用途>应该属于组件

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

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 中找不到这么多关于这个

最佳答案

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

我会更多地关注 refetchContainerpaginationContainer扩展 fragmentContainer 的想法并查看 Github 存储库本身,

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

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

关于javascript - 中继 createFragmentContainer 的现代用途,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44885085/

相关文章:

javascript - 将 Javascript 超链接替换为 Javascript 按钮

javascript - 如何在不复制片段的情况下传递 Prop

javascript - 从 Relay.js 存储中获取 React 组件之外的数据

Javascript replace() 每次只发生一次

javascript - 输入代码后,我收到一个错误,显示 "not called in your program",并且错误显示 btn 是预期的 token

graphql - 中继突变: Mutating Paginated Associations

javascript - 如何正确使用 GraphQL 订阅?

refactoring - GraphQL 中的多个 rootQuery 对象

javascript - 如何在 graphQL 中对字段进行运行时数据操作?

javascript - 如何在 reactJS 中处理数组内的更改状态? (对 Select 元素使用 antd design)