Search code examples
reactjsrendersetstate

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


I guess writing setState() inside render() leads to infinite call of the render(), but I have to update the condition in the similar way.

here is my mock code.

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 });
            }}/>
        )
    }
}

Solution

  • Define your handler method in Component body.

    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 });
    }
    

    Then reference it from render() like so :

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

    Finally, in <SomeComponent /> you can call it as :

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