在检查 render() 中的某些条件后,想使用 setState 更新状态值,我该怎么做?

after checking some condition inside render() want to update state value using setState, how can I do that?

我想在 render() 中写入 setState() 会导致无限调用 render(),但我必须以类似的方式更新条件。

这是我的模拟代码。

export default class MapSeat extends Component {
constructor(props) {
    super(props)
    this.state = {
      data: props.data
    }
  }

  componentWillReceiveProps(nextProps){
    this.setState({ data: nextProps.data });
  }

render(){
    const { data } = this.state;
    const { parameter1, parameter2} = data;

    return (
          <SomeComponent
            persons={data.persons}
            onPersonSelect={(f) => {
              let person = find(data.persons, function (o) { return o.id === f; });

              this.setState({
                data: {
                  parameter1: person.fullName,
                  parameter2: person.id
                }
              });
              this.setState({ data: this.state.data });
            }}/>
        )
    }
}

在组件主体中定义您的处理程序方法。

personSelectHandler(f){
 let data = // You need to get data from somewhere of course.
 let person = find(data.persons, function (o) { return o.id === f; });

          this.setState({
            data: {
              parameter1: person.fullName,
              parameter2: person.id
            }
          });
          this.setState({ data: this.state.data });
}

然后像这样从 render() 引用它:

render(){

 return (
      <SomeComponent
        persons={data.persons}
        onPersonSelect={this.personSelectHandler} />
 );
}

最后,在 <SomeComponent /> 中你可以这样称呼它:

handler(){
  let f = //your param to send parent
  this.props.onPersonSelect(f);
}

您可以做的是:

1) 定义回调函数,在你的例子中:

(f) => {
          let person = find(data.persons, function (o) { return o.id === f; });

          this.setState({
            data: {
              parameter1: person.fullName,
              parameter2: person.id
            }
          });
          this.setState({ data: this.state.data });
        }

作为 mapSeat 组件中的一个单独函数。(为简单起见,我们将此函数称为 'foo')

2) 将该函数绑定到地图座位组件构造函数:

this.foo = this.foo.bind(this);

3) 在调用组件时将您在步骤 2 中定义的函数的引用作为 props 传递:

<SomeComponent
        persons={data.persons}
        onPersonSelect={this.foo}/>

4) 最后在您的新组件(即 SomeComponent)中。每当需要回调函数时,只需按以下方式调用该函数即可:

this.props.foo();

由于第2步,函数将绑定到父组件的上下文。因此,即使从子组件调用它,也将能够修改父组件的状态。

注意:这将触发父组件的 render() 方法并扩展子组件。

希望对您有所帮助! :)