如何使用Relay QueryRenderer道具

时间:2017-11-29 01:07:37

标签: javascript reactjs graphql relay react-relay

我有一个带有用于更新数据库记录的表单的react组件。 事情是这样的:数据加载了React-Relay QueryRenderer组件,如下所示:

class Update extends Component {
   //constructor..
   //some stuff
   render() {
    return(
      <QueryRenderer
        environment={environment}
        query={UpdateQuery}
        render={({error, props}) => {
        //validations
          return (
            <Form loading={this.state.loading}>
            //inputs
            </Form>
           )...
      }/>
    )}

如果成功,props变量应该存储服务器响应的结果。但是,我需要使用this.state值调用更新。 我需要一种方法来使用道具值来设置setState。

我尝试过使用componentDidMount并使用refs字符串引用和回调函数来从Inputs获取defaultValue。调用this.refs

时,我得到了未定义的值

现在,如果我在QueryRenderer渲染函数中调用一个函数,它可以工作,如果state为空,则使用props设置状态。 E.g

function initValues(props){
  if(!this.state.name)
    this.setState({name: props.result.name})
}

但它导致我需要解决的反模式(纯渲染方法)。

修改 对于任何想知道如何解决这个问题的人。感谢查理的回答,我设法创建了一个UpdateForm组件包装器,它接收来自QueryRenderer的道具,为了更新我父组件的状态,我将handleChange函数作为道具传递给我的FormUpdate组件

1 个答案:

答案 0 :(得分:1)

在表单组件中使用componentWillReceiveProps

class Form extends React.Component {

    ...

    componentWillReceiveProps(nextProps) {
        if (nextProps.loading) return
        this.setState({
           name: nextProps.name
        })
    }

    ...
}

这只会在数据可用时立即设置状态一次,因为QueryRenderer仅在数据加载后调用render一次。