'React change state based on select option

I need to store the distance value in state. It should equal the distance passed as props + the distance selected by user. How to do this?

class Distance extends React.Component {
  constructor(props) {
    super(props);

    this.state = {
      distance: 0
    };
  }

  onChange = e => {
  }

  render() {
    return (
      <div>
        <p>{this.props.distance}</p>
        <select onChange={this.onChange}>
          <option>30km</option>
          <option>50km</option>
          <option>70km</option>
        </select>
      </div>
    );
  }
}


Solution 1:[1]

First add value attributes to your <option> elements, and then access the use the value of the <select> via e.currentTarget.value in your onChange handler like so:

class Distance extends React.Component {
  constructor(props) {
    super(props);

    this.state = {
      distance: 0
    };
  }

  onChange = e => {

     // Extract value of select like so. Use parseInt for
     // improved type safety
     const valueSelectedByUser = parseInt(e.target.value);

     // Update distance in state via setState()
     this.setState({ distance : this.props.distance + valueSelectedByUser });
  }

  render() {
    return (
      <div>
        <p>{this.props.distance}</p>
        <select onChange={this.onChange}>
          <option value="30">30km</option>
          <option value="50">50km</option>
          <option value="70">70km</option>
        </select>
      </div>
    );
  }
}

Solution 2:[2]

You should include value for select and handle onChange event:

class Distance extends React.Component {
  constructor(props) {
    super(props);

    this.state = {
      distance: 0
    };
  }

  onChange = e => {
     this.setState({
       distance: this.props.distance ? this.props.distance + e.target.value : e.target.value
     });
  }

  render() {
    return (
      <div>
        <p>{this.props.distance}</p>
        <select onChange={this.onChange}>
          <option value="30">30km</option>
          <option value="50">50km</option>
          <option value="70">70km</option>
        </select>
      </div>
    );
  }
}

Solution 3:[3]

you can simply do this like this, I have converted your code to functional components and also modified it, try this.

    const Distance = () => {
  const [distance, setDistance] = useState("");

  return (
    <div>
      <p>{distance}</p>
      <select onChange={(e) => setDistance(e.target.value)}>
        <option value="30">30km</option>
        <option value="50">50km</option>
        <option value="70">70km</option>
      </select>
    </div>
  );
};

export default Distance;

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Dacre Denny
Solution 2 Hai Pham
Solution 3 Dawood Ahmad