Relay-Modern FragmentContainer 数据未填充

Relay-Modern FragmentContainer data not populated

我正在使用 Relay Modern 尝试将数据加载到 FragmentContainer。我正在使用熟悉的 Container (Smart) / Presenter (Dumb) 模式,并且数据没有按预期传递到我的子 Container 中。但是,如果我使用 Relay 的 @relay(mask: false) 指令来查看 QueryRenderer 是否正确加载了片段数据, 片段数据就在那里 .

我不明白为什么数据没有发送到我的容器。非常感谢任何帮助。

ScreenContainer.js(呈现 QueryRenderer):

/* ScreenContainer.js */

import ScreenPresenter from './ScreenPreseenter';
const query = graphql`
query ScreenContainerQuery($id: ID!) {
  viewer {
    User(id: $id) {
      id
      ...NestedFragmentContainer_user
    }
  }
}`
export default class ScreenContainer extends Component {
  render() {
    <QueryRenderer 
      query={query} 
      variables={{id: id}} 
      render={() => <ScreenPresenter />} 
    />
  }
}

ScreenPresenter.js:

/* ScreenPresenter.js */

import NestedFragmentContainer from './NestedFragment';

export default class ScreenPresenter extends Component {
  render() {
    return <NestedFragmentContainer />
  }
}

最后,NestedFragmentContainer.js

/* ./NestedFragmentContainer.js */

class NestedFragmentContainer extends Component {
  render() {
    const { user } = this.props;
    console.log(user); // <-- Always null, not undefined
    return <Text>{user.account.name}</Text>;
  }
}
export default createFragmentContainer(
  NestedFragmentContainer,
  graphql`
    fragment NestedFragmentContainer_user on User {
      account {
        name
      }
    }
  `

此外,每当 NestedFragmentContainer 渲染时,我都会看到一个错误,它的 user 属性是 undefined。但是,console.log() 表明它的值实际上是 null,而不是 undefined

Warning: createFragmentContainerSpecResolver: Expected prop `user` 
to be supplied to Relay(NestedFragmentContainer)`, but got 
`undefined`. Pass an explicit `null` if this is intentional.

有谁知道为什么 FragmentContainer 没有使用其数据呈现​​?

您应该检查 QueryRenderer 组件中的渲染函数是否确实有数据到来或有错误。然后,如果数据在那里,你必须通过道具传递给用户。我没怎么用过 Relay,希望对你有帮助

假设查询成功,数据需要传递给呈现的组件。正如 Relay 现代文档中所述:

QueryRenderer is the root of a Relay tree. It takes a query, fetches the data and calls the render callback with the data.

在您的情况下,queryRenderer 应如下所示:

render() {
    return (
      <QueryRenderer
        environment={environment}
        query={query}
        variables={{id: id}}
        render={({error, props}) => {
          if (error) {
            return <div>{error.message}</div>
          } else if (props) {
            /*  Here is the crucial part */
            return < ScreenPresenter data={props.viewer} />               
          }
          return <div>Loading</div>
        }}
      />
    )
  }
}

然后您就可以将 props 从容器组件(智能)传递到展示组件(愚蠢)。