javascript - Relay-Modern FragmentContainer 数据未填充

标签 javascript reactjs graphql relaymodern react-relay

我正在使用 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 Prop 是 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 没有使用其数据呈现​​?

最佳答案

假设查询成功,数据需要传递给呈现的组件。正如 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 从容器组件(智能)传递到展示组件(愚蠢)。

关于javascript - Relay-Modern FragmentContainer 数据未填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47584319/

相关文章:

javascript - 如果 href 有 # 则不想加载窗口

javascript - 从长字符串中提取javascript中以 "(/"开头并以 "/)"结尾的特定字符串

javascript - 井字游戏 React Js : Not able to print location

javascript - 如何在react组件中使用npm包javascript

node.js - 在ApolloServer中支持异议 `$formatJson`

javascript - 如何将变量数据传递给createFragmentContainer

javascript - 如何根据其他JSON数据选择JSON中的数据? Javascript

javascript - 如何在 Circle 类之上实现 Shape 类?

reactjs - 如何编写测试用例以通过 mocha nyc for API 传递代码覆盖率?

reactjs - Apollo React subscribeToMore 不更新数据