在现代接力中将变量传递给片段容器

Mai*_*uiz 9 relayjs relaymodern

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

// 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)
Run Code Online (Sandbox Code Playgroud)

它最终会说$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
Run Code Online (Sandbox Code Playgroud)

使用relay classic,您可以通过这种方式传递变量:

....
employee(id: $employeeId) {
  fullName
  ${MyFragmentComponent.getFragment('employee', variables)}
}
Run Code Online (Sandbox Code Playgroud)

如何通过现代接力实现同样的目标?

Mai*_*uiz 11

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

在片段定义中:

const fragments = {
  employee: graphql`
    fragment MyFragmentComponent_employee on Employee
    @argumentDefinitions(includeOvertime: { type: "Boolean", defaultValue: false }) {
      hoursWorked(includeOvertime: $includeOvertime)
      dob
      fullName
      id
    }
  `,
}
Run Code Online (Sandbox Code Playgroud)

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

@argumentDefinitions(includeOvertime: { type: "Boolean!" })
Run Code Online (Sandbox Code Playgroud)

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

const query = graphql`
  query MyRootComponentQuery($employeeId: String!, $includeOvertime: Boolean) {
    employee(id: $employeeId) {
      fullName
      ...MyFragmentComponent_employee @arguments(includeOvertime: $includeOvertime)
    }
  }
`
Run Code Online (Sandbox Code Playgroud)

在官方中继文档的这个页面中,有一个用于定义/传递参数的指令示例.

更新:

由于不推荐继电器版本1.4.0 graphql.experimental,现在常规graphql标签支持所有功能.

更新:

在继电器版本1.5.0 graphql.experimental被删除.