How to get selected value of a dropdown menu in ReactJS

后端 未结 9 1833
迷失自我
迷失自我 2020-12-04 10:03

I\'m using react and I want to get the value of the selected option of a dropdown in react but I don\'t know how. Any suggestions? thanks! My dropdown is just a select like:

相关标签:
9条回答
  • 2020-12-04 10:31

    The code in the render method represents the component at any given time. If you do something like this, the user won't be able to make selections using the form control:

    <select value="Radish">
      <option value="Orange">Orange</option>
      <option value="Radish">Radish</option>
      <option value="Cherry">Cherry</option>
    </select>
    

    So there are two solutions for working with forms controls:

    1. Controlled Components Use component state to reflect the user's selections. This provides the most control, since any changes you make to state will be reflected in the component's rendering:

    example:

    var FruitSelector = React.createClass({
        getInitialState:function(){
          return {selectValue:'Radish'};
      },
        handleChange:function(e){
        this.setState({selectValue:e.target.value});
      },
      render: function() {
        var message='You selected '+this.state.selectValue;
        return (
          <div>
          <select 
            value={this.state.selectValue} 
            onChange={this.handleChange} 
          >
           <option value="Orange">Orange</option>
            <option value="Radish">Radish</option>
            <option value="Cherry">Cherry</option>
          </select>
          <p>{message}</p>
          </div>        
        );
      }
    });
    
    React.render(<FruitSelector name="World" />, document.body);
    

    JSFiddle: http://jsfiddle.net/xe5ypghv/

    1. Uncontrolled Components The other option is to not control the value and simply respond to onChange events. In this case you can use the defaultValue prop to set an initial value.

      <div>
       <select defaultValue={this.state.selectValue} 
       onChange={this.handleChange} 
       >
          <option value="Orange">Orange</option>
          <option value="Radish">Radish</option>
          <option value="Cherry">Cherry</option>
        </select>
        <p>{message}</p>
        </div>       
      

    http://jsfiddle.net/kb3gN/10396/

    The docs for this are great: http://facebook.github.io/react/docs/forms.html and also show how to work with multiple selections.

    UPDATE

    A variant of Option 1 (using a controlled component) is to use Redux and React-Redux to create a container component. This involves connect and a mapStateToProps function, which is easier than it sounds but probably overkill if you're just starting out.

    0 讨论(0)
  • 2020-12-04 10:38

    Just use onChange event of the <select> object. Selected value is in e.target.value then.

    By the way, it's a bad practice to use id="...". It's better to use ref=">.." http://facebook.github.io/react/docs/more-about-refs.html

    0 讨论(0)
  • 2020-12-04 10:39

    As for front-end developer many time we are dealing with the forms in which we have to handle the dropdowns and we have to use the value of selected dropdown to perform some action or the send the value on the Server, it's very simple you have to write the simple dropdown in HTML just put the one onChange method for the selection in the dropdown whenever user change the value of dropdown set that value to state so you can easily access it in AvFeaturedPlayList 1 remember you will always get the result as option value and not the dropdown text which is displayed on the screen

    import React, { Component } from "react";
    import { Server } from "net";
    
    class InlineStyle extends Component {
      constructor(props) {
        super(props);
        this.state = {
          selectValue: ""
        };
    
        this.handleDropdownChange = this.handleDropdownChange.bind(this);
      }
    
      handleDropdownChange(e) {
        this.setState({ selectValue: e.target.value });
      }
    
      render() {
        return (
          <div>
            <div>
              <div>
                <select id="dropdown" onChange={this.handleDropdownChange}>
                  <option value="N/A">N/A</option>
                  <option value="1">1</option>
                  <option value="2">2</option>
                  <option value="3">3</option>
                  <option value="4">4</option>
                </select>
              </div>
    
              <div>Selected value is : {this.state.selectValue}</div>
            </div>
          </div>
        );
      }
    }
    export default InlineStyle;
    
    0 讨论(0)
  • 2020-12-04 10:39

    It is as simple as that. You just need to use "value" attributes instead of "defaultValue" or you can keep both if a pre-selected feature is there.

     ....
    const [currentValue, setCurrentValue] = useState(2);
    <select id = "dropdown" value={currentValue} defaultValue={currentValue}>
         <option value="N/A">N/A</option>
         <option value="1">1</option>
         <option value="2">2</option>
         <option value="3">3</option>
         <option value="4">4</option>
      </select>
    .....
    
    setTimeut(()=> {
     setCurrentValue(4);
    }, 4000);
    

    In this case, after 4 secs the dropdown will be auto-selected with option 4.

    0 讨论(0)
  • 2020-12-04 10:41
    import React from 'react';
    import Select from 'react-select';
    
    const options = [
      { value: 'chocolate', label: 'Chocolate' },
      { value: 'strawberry', label: 'Strawberry' },
      { value: 'vanilla', label: 'Vanilla' },
    ];
    
    class App extends React.Component {
      state = {
        selectedOption: null,
      };
      handleChange = selectedOption => {
        this.setState({ selectedOption });
        console.log(`Option selected:`, selectedOption);
      };
      render() {
        const { selectedOption } = this.state;
    
        return (
          <Select
            value={selectedOption}
            onChange={this.handleChange}
            options={options}
          />
        );
      }
    }
    

    And you can check it out on this site.

    0 讨论(0)
  • 2020-12-04 10:42

    I was making a drop-down menu for a language selector - but I needed the dropdown menu to display the current language upon page load. I would either be getting my initial language from a URL param example.com?user_language=fr, or detecting it from the user’s browser settings. Then when the user interacted with the dropdown, the selected language would be updated and the language selector dropdown would display the currently selected language.

    In the spirit of the other answers using food examples, I got all sorts of fruit goodness for you.

    • First up, answering the initially asked question with a basic React functional component - two examples with and without props, then how to import the component elsewhere.

    • Next up, the same example - but juiced up with Typescript.

    • Then a bonus finale - A language selector dropdown component using Typescript.


    Basic React (16.13.1) Functional Component Example. Two examples of FruitSelectDropdown , one without props & one with accepting props fruitDetector

    import React, { useState } from 'react'
    
    export const FruitSelectDropdown = () => {
      const [currentFruit, setCurrentFruit] = useState('oranges')
      
      const changeFruit = (newFruit) => {
        setCurrentFruit(newFruit)
      }
      
      return (
        <form>
          <select 
            onChange={(event) => changeFruit(event.target.value)}
            value={currentFruit}
          >
            <option value="apples">Red Apples</option>
            <option value="oranges">Outrageous Oranges</option>
            <option value="tomatoes">Technically a Fruit Tomatoes</option>
            <option value="bananas">Bodacious Bananas</option>
          </select>
        </form>
      )
    }
    

    Or you can have FruitSelectDropdown accept props, maybe you have a function that outputs a string, you can pass it through using the fruitDetector prop

    import React, { useState } from 'react'
    
    export const FruitSelectDropdown = ({ fruitDetector }) => {
      const [currentFruit, setCurrentFruit] = useState(fruitDetector)
      
      const changeFruit = (newFruit) => {
        setCurrentFruit(newFruit)
      }
      
      return (
        <form>
          <select 
            onChange={(event) => changeFruit(event.target.value)}
            value={currentFruit}
          >
            <option value="apples">Red Apples</option>
            <option value="oranges">Outrageous Oranges</option>
            <option value="tomatoes">Technically a Fruit Tomatoes</option>
            <option value="bananas">Bodacious Bananas</option>
          </select>
        </form>
      )
    }
    

    Then import the FruitSelectDropdown elsewhere in your app

    import React from 'react'
    import { FruitSelectDropdown } from '../path/to/FruitSelectDropdown'
    
    const App = () => {
      return (
        <div className="page-container">
          <h1 className="header">A webpage about fruit</h1>
          <div className="section-container">
            <h2>Pick your favorite fruit</h2>
            <FruitSelectDropdown fruitDetector='bananas' />
    
          </div>
        </div>
      )
    }
    
    export default App
    

    FruitSelectDropdown with Typescript

    import React, { FC, useState } from 'react'
    
    type FruitProps = {
      fruitDetector: string;
    }
    
    export const FruitSelectDropdown: FC<FruitProps> = ({ fruitDetector }) => {
      const [currentFruit, setCurrentFruit] = useState(fruitDetector)
      
      const changeFruit = (newFruit: string): void => {
        setCurrentFruit(newFruit)
      }
      
      return (
        <form>
          <select 
            onChange={(event) => changeFruit(event.target.value)}
            value={currentFruit}
          >
            <option value="apples">Red Apples</option>
            <option value="oranges">Outrageous Oranges</option>
            <option value="tomatoes">Technically a Fruit Tomatoes</option>
            <option value="bananas">Bodacious Bananas</option>
          </select>
        </form>
      )
    }
    

    Then import the FruitSelectDropdown elsewhere in your app

    import React, { FC } from 'react'
    import { FruitSelectDropdown } from '../path/to/FruitSelectDropdown'
    
    const App: FC = () => {
      return (
        <div className="page-container">
          <h1 className="header">A webpage about fruit</h1>
          <div className="section-container">
            <h2>Pick your favorite fruit</h2>
            <FruitSelectDropdown fruitDetector='bananas' />
    
          </div>
        </div>
      )
    }
    
    export default App
    

    Bonus Round: Translation Dropdown with selected current value:

    import React, { FC, useState } from 'react'
    import { useTranslation } from 'react-i18next'
    
    export const LanguageSelectDropdown: FC = () => {
      const { i18n } = useTranslation()
      const i18nLanguage = i18n.language
      const [currentI18nLanguage, setCurrentI18nLanguage] = useState(i18nLanguage)
      
      const changeLanguage = (language: string): void => {
        i18n.changeLanguage(language)
        setCurrentI18nLanguage(language)
      }
      
      return (
        <form>
          <select 
            onChange={(event) => changeLanguage(event.target.value)}
            value={currentI18nLanguage}
          >
            <option value="en">English</option>
            <option value="de">Deutsch</option>
            <option value="es">Español</option>
            <option value="fr">Français</option>
          </select>
        </form>
      )
    }
    

    An invaluable resource for React/Typescript

    0 讨论(0)
提交回复
热议问题