【问题标题】:Why are Relay Modern QueryRenderer render props undefined?为什么 Relay Modern QueryRenderer 渲染道具未定义?
【发布时间】:2018-03-27 03:17:46
【问题描述】:

这是我第一次尝试使用 Relay Modern。 从PostgraphQL GraphQL Server 获取特定用户。 它正在成功获取数据但未传递给渲染函数:

import {createFragmentContainer, QueryRenderer, graphql} from 'react-relay'
import environment from 'environment'

@CSSModules(styles) export default class Profile extends Component {   
  render() {
    var {props: {children}} = this
    return (
      <QueryRenderer
        environment={environment}
        query={graphql`
          query ProfileQuery {
            userById(id: "f0301eaf-55ad-46db-ac90-b52d6138489e") {
              firstName
              userName
            }
          }
        `}
        render={({error, relayProps}) => {
          if (error) {
            return <div>{error.message}</div>
          } else if (relayProps) {
            ...
          }
          return <div>Loading...</div>
        }}
      />
    )   
  }
} 

仅呈现“正在加载...”。

我猜是因为它成功获取了 graphql 服务器和环境正常的数据。

我没有使用 React 16,该项目也使用 Redux。

关于为什么relayProps 没有值(例如relayProps.user)有什么建议吗?

另一件事可能会有所帮助,环境(文件)位于主应用程序中,QueryRenderer 和组件位于导入的 npm 包中(将在多个应用程序之间共享)。如前所述,查询似乎工作正常,所以我认为这不是问题。我还在包上运行中继编译器,但不是在主应用程序上运行,因为那里没有中继组件。

以防万一需要使用以下方法设置环境:

const {
  Environment,
  Network,
  RecordSource,
  Store,
} = require('relay-runtime')

// Instantiate Store for Cached Data
const store = new Store(new RecordSource())

// Create Network for GraphQL Server
const network = Network.create((operation, variables) => {
  // GraphQL Endpoint
  return fetch(config.gqlapiProtocol + "://" + config.gqlapiHost + config.gqlapiUri + "/a3/graphql" , {
    method: 'POST',
    headers: {
      'Content-Type': "application/json",
      'Accept': 'application/json',
    },
    body: JSON.stringify({
      query: operation.text,
      variables,
    }),
  }).then(response => {
    return response.json()
  })
})

// Instantiate Environment
const environment = new Environment({
  network,
  store,
})

// Export environment
export default environment

【问题讨论】:

  • 你确定你的网络层被调用了吗?您是否在 response.json() 中看到您的数据和/或错误。就我而言,我有一个后续的.then(json =&gt; { // Allow Relay onError to get fired in case of errors in response // See: https://github.com/facebook/relay/issues/1816 // NOTICE: that data might contain values even when errors present if(json.errors &amp;&amp; json.errors.length &gt; 0) { return Promise.reject(json); } return Promise.resolve(json); })
  • 是的,我在响应中看到了正确的数据。这就是为什么我觉得网络没问题的原因。调用渲染也没有错误。谢谢你们的cmets。不过我会尝试你的建议,很好的补充。

标签: javascript graphql relaymodern


【解决方案1】:

props 不是relayprops

    render={({ error, props }) => {
      if (error) {
        return <div>{error.message}</div>;
      } else if (props) {
        ...
      }
      return <div>Loading...</div>;
    }}

fetch(GRAPHQL_URL, {
  method: 'POST',
  get headers() {
    return {
      'Content-Type': 'application/json',
      'Accept': 'application/json',
    };
  },
  body: JSON.stringify({
    query: operation.text, // GraphQL text from input
    variables
  })
})
  .then(response => response.json())
  .then((json) => {
    // https://github.com/facebook/relay/issues/1816
    if (operation.query.operation === 'mutation' && json.errors) {
      return Promise.reject(json);
    }

    return Promise.resolve(json);
  })
);

【讨论】:

  • 谢谢,但我不确定参数的名称(props、relayProps、x、y、z、...)在这种情况下有什么不同吗?我认为代码只是定义了一个函数,该函数采用具有两个属性的解构对象并在函数中使用这些属性。如果我错了,请纠正我。
  • render={({ error, props, retry }) =&gt; { }}render={(relayProps) =&gt; { const { error, props, retry } = relayProps; }} 你明白了吗?
  • 不知道为什么这被否决了。如果您尝试解构参数,则名称很重要,他是对的。
  • 没什么区别,就是ES6解构赋值语法
猜你喜欢
  • 2018-01-28
  • 2017-12-27
  • 2018-05-12
  • 2017-11-09
  • 2017-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-15
相关资源
最近更新 更多