Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Show object's value text depending on select option

so I have this issue I am trying to solve, with React.

Let's say I have an object like so:

"options": {
    "open": {
        "text": "Open (Risky)",
        "description": "Filler text for open"
    },

    "wpa": {
       "text": "WPAWPA2PSK (TKIP / AES)",
       "description": "Filler text for wpa"
    },

    "wpa2": {
       "text": "WPA2-PSK (AES) (Recommended)",
       "description": "Filler text for wpa2"
   }
}

And I have it setup that the object's value's "text" is used to populate option values in a select dropdown, like so:

const securityModeOptions = Object.values(securityMode.select.options);

{securityModeOptions.map((mode, index) =>
    <option key={index} value={mode.text}>
        {mode.text}
    </option>
)}

What I would like to do is that whichever option value is selected, it's corresponding "description" is displayed in a div next to it, and the div changes based on whichever option is selected.

Thanks!

like image 605
Lushmoney Avatar asked Nov 12 '18 16:11

Lushmoney


Video Answer


2 Answers

You can manage a state of the selected key, then grab the relevant entry from the options object via the key.

Something like this:

const options = {
  open: {
    text: "Open (Risky)",
    description: "Filler text for open"
  },

  wpa: {
    text: "WPAWPA2PSK (TKIP / AES)",
    description: "Filler text for wpa"
  },

  wpa2: {
    text: "WPA2-PSK (AES) (Recommended)",
    description: "Filler text for wpa2"
  }
};

class App extends React.Component {
  state = { selectedOptionKey: "" };
  onChange = ({ target }) => {
    this.setState({ selectedOptionKey: target.value });
  };
  render() {
    const { selectedOptionKey } = this.state;
    const description =
      options[selectedOptionKey] && options[selectedOptionKey].description;
    return (
      <div>
        <select onChange={this.onChange}>
          <option>Choose</option>
          {Object.entries(options).map(([key, value]) => (
            <option value={key}>{value.text}</option>
          ))}
        </select>
        <div>{description}</div>
      </div>
    );
  }
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="root"/>
like image 127
Sagiv b.g Avatar answered Nov 03 '22 04:11

Sagiv b.g


You could keep the key of the selected option in state and show the description of this selected option.

Example

const options = {
  open: {
    text: "Open (Risky)",
    description: "Filler text for open"
  },

  wpa: {
    text: "WPAWPA2PSK (TKIP / AES)",
    description: "Filler text for wpa"
  },

  wpa2: {
    text: "WPA2-PSK (AES) (Recommended)",
    description: "Filler text for wpa2"
  }
};

class App extends React.Component {
  state = {
    options,
    selected: Object.keys(options)[0]
  };

  onChange = event => {
    this.setState({ selected: event.target.value });
  };

  render() {
    const { options, selected } = this.state;

    return (
      <div>
        <select onChange={this.onChange}>
          {Object.keys(options).map(key => (
            <option key={key} value={key}>
              {options[key].text}
            </option>
          ))}
        </select>
        <span>{options[selected].description}</span>
      </div>
    );
  }
}

ReactDOM.render(<App />, document.getElementById("root"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>

<div id="root"></div>
like image 22
Tholle Avatar answered Nov 03 '22 06:11

Tholle