javascript - 如何使用 Relay QueryRenderer 属性更新状态

标签 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 值调用更新。 我需要一种使用 props 值来 setState 的方法。

我尝试使用 componentDidMount 并使用字符串引用和回调引用来从输入中获取defaultValue。我在调用 this.refs 时得到了未定义的值

目前,如果我在 QueryRenderer 渲染函数中调用一个函数,该函数在状态为空时使用 props 设置状态,那么它就可以工作。例如

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

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

编辑: 对于任何想知道我是如何解决这个问题的人。感谢 charlie 的回答,我成功创建了一个 UpdateForm 组件包装器,它接收来自 QueryRenderer 的 props,并且为了更新我父级的组件状态,我将 handleChange 函数作为 props 传递给我的 FormUpdate 组件

最佳答案

使用componentWillReceiveProps在您的表单组件中

class Form extends React.Component {

    ...

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

    ...
}

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

关于javascript - 如何使用 Relay QueryRenderer 属性更新状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47543472/

相关文章:

javascript - React.js 不会在 setState 上重新渲染

python - 我可以从 GraphQL 模式生成 REST 服务吗?

javascript - HTML 元素大小(以字节为单位)

javascript - 在 EJS 中使用带有变量的条件

javascript - piwik 无法在 HTTPS 中工作

javascript - HTML 将表单输入传递给 JavaScript 并重置表单字段

javascript - React 无法使用 (props)=> 访问类外的 Prop 值

javascript - 将 UI Fabric PeoplePicker 与 React 结合使用需要什么特别的东西吗?

javascript - 如何使用 Apollo 实现突变的 auth 指令?

node.js - Apollo Server Express + GraphQL 关系