将变量传递给现代中继中的片段容器

Posted

技术标签:

【中文标题】将变量传递给现代中继中的片段容器【英文标题】:Pass variables to fragment container in relay modern 【发布时间】:2017-11-28 22:12:36 【问题描述】:

我正在使用Relay Modern(兼容)。我有一个片段,其中包含一个具有一个参数的字段,但我找不到从父组件传递变量值的方法:

// MyFragmentComponent.jsx

class MyFragmentComponent extends Component ...

const fragments = 
  employee: graphql`
    fragment MyFragmentComponent_employee on Employee 
      hoursWorked(includeOvertime: $includeOvertime)
      dob
      fullName
      id
    
  `,


export default Relay.createFragmentContainer(MyFragmentComponent, fragments)

它最终会说$includeOvertime 未定义。渲染此组件的上下文如下所示:

// MyRootComponent.jsx

class MyRootComponent extends Component 
  render() 
    const  employee  = this.props
    const includeOvertime = //... value is available here

    return (
      <div>
        <MyFragmentComponent employee=employee />
      </div>
    )
  


const query = graphql`
  query MyRootComponentQuery($employeeId: String!) 
    employee(id: $employeeId) 
      fullName
      ...MyFragmentComponent_employee
    
  
`

export default MyUtils.createQueryRenderer(MyRootComponent, query) // this just returns a QueryRenderer

使用经典中继,您可以通过这种方式传递变量:

....
employee(id: $employeeId) 
  fullName
  $MyFragmentComponent.getFragment('employee', variables)

如何使用现代继电器实现同样的目标?

【问题讨论】:

【参考方案1】:

使用@argumentDefinitions@arguments 指令似乎是要走的路。在 1.4.0 之前的中继版本中,必须使用 graphql.experimental 而不是 graphql

在片段定义中:

const fragments = 
  employee: graphql`
    fragment MyFragmentComponent_employee on Employee
    @argumentDefinitions(includeOvertime:  type: "Boolean", defaultValue: false ) 
      hoursWorked(includeOvertime: $includeOvertime)
      dob
      fullName
      id
    
  `,

如果您希望参数是必需的:

@argumentDefinitions(includeOvertime:  type: "Boolean!" )

在父组件中,您应该像这样指定片段的参数:

const query = graphql`
  query MyRootComponentQuery($employeeId: String!, $includeOvertime: Boolean) 
    employee(id: $employeeId) 
      fullName
      ...MyFragmentComponent_employee @arguments(includeOvertime: $includeOvertime)
    
  
`

在官方中继文档的this page 中有一个用于定义/传递参数的指令示例。

更新:

由于中继 version 1.4.0 graphql.experimental 已被弃用,现在所有功能都由常规 graphql 标签支持。

更新:

在中继中 version 1.5.0 graphql.experimental 已被删除。

【讨论】:

以上是关于将变量传递给现代中继中的片段容器的主要内容,如果未能解决你的问题,请参考以下文章

在 QueryRenderer 中传递中继现代变量

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

中继 createFragmentContainer 的现代目的

在 React 中渲染 Relay 现代片段

中继现代嵌套分页

如何乐观响应中继现代突变中的连接属性?