1

我正在使用 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渲染时,我都会看到它的userprop 为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 没有用它的数据呈现?

4

2 回答 2

1

假设查询成功,数据需要传递给渲染组件。如中继现代文档中所述:

QueryRenderer 是 Relay 树的根。它接受查询,获取数据并使用数据调用渲染回调。

在您的情况下,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>
        }}
      />
    )
  }
}

然后,您将能够将道具从容器组件(智能)传递到展示组件(哑)。

于 2017-12-02T18:10:43.237 回答
0

您应该检查 QueryRenderer 组件内的渲染函数,如果数据实际到来或有错误。然后,如果数据在那里,您必须通过道具传递用户。我没有太多使用 Relay,但我希望这可以帮助

于 2017-12-01T17:39:15.730 回答