除非重新启动浏览器,否则当新道具可用时,组件不会重新呈现

时间:2017-09-08 14:25:37

标签: javascript reactjs

我正在使用react-table,我有一个嵌套的组件。该组件是一个包含3个列表的表单。我在每个列表上使用onChange回调,每当有更改时,我都会将其写入数据库。当我切换react-table的嵌套组件时,一切正常。如果我将againg切换回嵌套组件,则更改的状态将不会持续,但数据实际上已在数据库上发生更改。我注意到的一件事是,如果我在列表上做了更改后立即重新加载页面,一切正常。

嵌套组件代码:

constructor(props, context) {
      super(props, context)
      this.state = {
       assesmentLocal: this.props.row.row.assessment_type || ''
      }
    }

  componentWillReceiveProps(nextProps) {
  if (this.props.row.row.assessment_type !== nextProps.row.row.assessment_type) {
      this.setState({
        assesmentLocal: nextProps.row.row.assessment_type || '',
      });
    }
  }


  onChangeAssessmentTypeLocal (row, e) {
    // Save the new record to DB.
    this.props.onChangeAssessmentType(e.target.value, row.row.guideline_id);
    this.setState({
      assesmentLocal:e.target.value
    })
  }

  //render method
  <FormControl
    id="assessmentType"
    onChange={this.onChangeAssessmentTypeLocal.bind(this, this.props.row)}
    componentClass="select"
    placeholder="select"
    defaultValue={this.state.assesmentLocal}

  >
      <option value="INITIAL">INITIAL</option>
      <option value="GENERAL">GENERAL</option>
      <option value="SPECIALTY">SPECIALTY</option>
  </FormControl>

react-table组件代码:

<ReactTable className={"-striped -highlight"}
    SubComponent={(row) => {
      return (
        <SubTable
          row={ row }
        )
      }}
  />

Toggle component

如果我从GENERAL更改为INITIAL并隐藏嵌套组件并将其切换回来,它将再次显示GENERAL,但在DB中我现在有INITIAL以及我的redux商店

我有什么想法可以解决这个问题吗?

更新

this.props.row.row日志:

enter image description here

2 个答案:

答案 0 :(得分:0)

问题应该在于您的FormControl,它没有value道具。

 <FormControl
    id="assessmentType"
    onChange={this.onChangeAssessmentTypeLocal.bind(this, this.props.row)}
    componentClass="select"
    placeholder="select"
    defaultValue=""
    value={this.state.assesmentLocal}
  >

答案 1 :(得分:0)

这可能是因为不确定条件已设置在componentWillReceiveProps

你有这样的尝试吗?

componentWillReceiveProps(nextProps) {
 if (nextProps.row.row) {
  this.setState({
    assesmentLocal: nextProps.row.row.assessment_type || '',
  });
 }
}