【问题标题】:How to get selected value of a dropdown menu in ReactJS如何在 ReactJS 中获取下拉菜单的选定值
【发布时间】:2015-05-20 10:53:01
【问题描述】:

我正在使用 react,我想在 react 中获取下拉列表的选定选项的值,但我不知道如何。有什么建议?谢谢! 我的下拉列表只是一个选择,例如:

<select id = "dropdown">
    <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>

【问题讨论】:

  • alert(dropdown.value)
  • 额外说明:我想使用 select 并将值传递给方法。
  • &lt;select onchange=method(value)&gt;,或者使用更复杂的off-side bind,或者来自JS,method(drowdown.value)

标签: javascript select drop-down-menu menu reactjs


【解决方案1】:

render 方法中的代码表示任何给定时间的组件。 如果您使用something like this,用户将无法使用表单控件进行选择:

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

所以有两种使用表单控件的解决方案:

  1. 受控组件 使用组件state 反映用户的选择。这提供了最大程度的控制,因为您对 state 所做的任何更改都将反映在组件的渲染中:

示例:

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. 不受控制的组件 另一种选择是不控制值并简单地响应onChange 事件。在这种情况下,您可以使用 defaultValue 属性设置初始值。

    <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/

这方面的文档很棒:http://facebook.github.io/react/docs/forms.html 并展示如何处理多项选择。

更新

选项 1 的变体(使用受控组件)是使用 ReduxReact-Redux 创建 container component。这涉及到connectmapStateToProps 函数,这比听起来容易,但如果你刚刚开始,可能会有点矫枉过正。

【讨论】:

  • 嘿,你的答案正是我想要的!但是,我不明白 value={this.state.selectValue} 的目的。我查看文档,它指出:渲染元素的值将始终反映 value 属性。但是,即使我删除以下行,您的示例似乎也有效:value={this.state.selectValue}。这条线到底是做什么的?这与他们使用 value="Hello!" 的文档中的示例有何不同?在我看来,唯一重要的是 handleChange(处理 setState)方法和 message 变量。
  • @desgarron6 好问题!在受控组件示例中,value={this.state.selectValue} 有效地设置了输入的默认值。这之前并不清楚,因为“橙色”无论如何都是默认设置,因为它是第一个选项。我更新了代码以将“Radish”设置为this.state.selectValue 的初始值。如果您注释掉您提到的行,结果如下:jsfiddle.net/f00erjqs UI 不同步。
  • 谢谢!太棒了。我相信这是下拉菜单的性质,橙色本来是让我感到困惑的原始值。感谢您的澄清。
  • @desgarron6 当然!玩得开心。我建议通读todomvc.com/examples/react/# 来源,了解如何处理用户输入。
【解决方案2】:

将你的 Dropdown 实现为

<select id = "dropdown" ref = {(input)=> this.menu = input}>
    <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>

现在,要获取下拉菜单的选定选项值,只需使用:

let res = this.menu.value;

【讨论】:

【解决方案3】:

只需使用&lt;select&gt; 对象的onChange 事件。 然后选择的值在e.target.value 中。

顺便说一句,使用id="..." 是一种不好的做法。最好使用ref="&gt;.." http://facebook.github.io/react/docs/more-about-refs.html

【讨论】:

  • 一个代码示例会使这个答案更有价值,尤其是对于初学者。
【解决方案4】:

对于前端开发人员,我们很多时候都在处理必须处理下拉列表的表单,我们必须 使用选中的下拉列表的值来执行一些操作或在服务器上发送值,这很简单 您必须在 HTML 中编写简单的下拉列表,只需将一个 onChange 方法用于下拉列表中的选择 每当用户更改下拉列表的值时,将该值设置为状态,以便您可以在 AvFeaturedPlayList 中轻松访问它 1 请记住,您将始终将结果作为选项值而不是显示在屏幕上的下拉文本

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;

【讨论】:

    【解决方案5】:

    应该是这样的:

    import React, { useState } from "react";
    
    export default function App() {
      const getInitialState = () => {
        const value = "Orange";
        return value;
      };
    
      const [value, setValue] = useState(getInitialState);
    
      const handleChange = (e) => {
        setValue(e.target.value);
      };
    
      return (
        <div>
          <select value={value} onChange={handleChange}>
            <option value="Orange">Orange</option>
            <option value="Radish">Radish</option>
            <option value="Cherry">Cherry</option>
          </select>
          <p>{`You selected ${value}`}</p>
        </div>
      );
    }
    

    你可以在这里看到它:https://codesandbox.io/s/quizzical-https-t1ovo?file=/src/App.js:0-572

    【讨论】:

      【解决方案6】:

      使用 React 函数式组件:

      const [option,setOption] = useState()
      
      function handleChange(event){
          setOption(event.target.value)
      }
      
      <select name='option' onChange={handleChange}>
          <option value="1">1</option>
          <option value="2">2</option>
          <option value="3">3</option>
          <option value="4">4</option>
      </select>
      

      【讨论】:

        【解决方案7】:
        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}
              />
            );
          }
        }
        

        您可以在site 上查看。

        【讨论】:

          【解决方案8】:

          就这么简单。您只需要使用 "value" 属性而不是 "defaultValue" 或者如果有预选的功能,您可以同时保留这两个属性。

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

          在这种情况下,4 秒后下拉菜单将使用选项 4 自动选择。

          【讨论】:

          • onChange 在哪里。最好贴出全图
          【解决方案9】:

          我正在为语言选择器制作一个下拉菜单 - 但我需要下拉菜单来在页面加载时显示当前语言。我要么从 URL 参数example.com?user_language=fr 获取我的初始语言,要么从用户的浏览器设置中检测它。然后当用户与下拉菜单交互时,所选语言将被更新,并且语言选择器下拉菜单将显示当前选择的语言。

          本着使用食物示例的其他答案的精神,我为您准备了各种水果。

          • 首先,用一个基本的 React 功能组件回答最初提出的问题 - 两个带有和不带有 props 的示例,然后是如何在其他地方导入组件。

          • 接下来,同样的例子 - 但使用 Typescript 进行了优化。

          • 然后是一个额外的结局 - 使用 Typescript 的语言选择器下拉组件。


          基本 React (16.13.1) 功能组件示例。 FruitSelectDropdown 的两个示例,一个没有道具,一个接受道具 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>
            )
          }
          

          或者你可以让 FruitSelectDropdown 接受 props,也许你有一个输出字符串的函数,你可以使用 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>
            )
          }
          

          然后将FruitSelectDropdown 导入应用中的其他位置

          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 使用打字稿

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

          然后将FruitSelectDropdown 导入应用中的其他位置

          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
          

          奖金回合:选择当前值的翻译下拉菜单:

          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

          【讨论】:

            【解决方案10】:

            你可以在下面的同一个函数中处理它

            <select className="form-control mb-3" onChange={(e) => this.setState({productPrice: e.target.value})}>
            
              <option value="5">5 dollars</option>
              <option value="10">10 dollars</option>
                                                     
            </select>

            正如您所看到的,当用户选择一个选项时,它将设置一个状态并获取所选事件的值,而无需进一步编码!

            【讨论】:

            • 这是默认选择值的问题,而不是选择值之后的问题。例如,在您的代码中,如果 10 美元是 API 中默认选择的值,您需要使用此默认选择呈现应用,而无需任何用户交互。
            • 您好,如果您需要指定默认值,您可以使用 defaultValue="10",这将选择您的选项。我希望它有所帮助。
            【解决方案11】:

            如果你想从映射的选择输入中获取值,那么你可以参考这个例子:

            class App extends React.Component {
                  constructor(props) {
                    super(props);
                    this.state = {
                      fruit: "banana",
                    };
                
                    this.handleChange = this.handleChange.bind(this);
                  }
                
                  handleChange(e) {
                    console.log("Fruit Selected!!");
                    this.setState({ fruit: e.target.value });
                  }
                
                  render() {
                    return (
                      <div id="App">
                        <div className="select-container">
                          <select value={this.state.fruit} onChange={this.handleChange}>
                            {options.map((option) => (
                              <option value={option.value}>{option.label}</option>
                            ))}
                          </select>
                        </div>
                      </div>
                    );
                  }
                }
                
                export default App;
            

            【讨论】:

              【解决方案12】:
              import {React, useState }from "react";
              
              function DropDown() {
              
              const [dropValue, setDropValue ]= useState();
              
              return <>
                  <div>
                      <div class="dropdown">
                        <button class="btn btn-secondary" type="button" id="dropdownMenuButton1" data-bs-toggle="dropdown" aria-expanded="false">
                          {dropValue==null || dropValue=='' ?'Select Id':dropValue}
                        </button>
                        <ul class="dropdown-menu" aria-labelledby="dropdownMenuButton1">
                          <li><a class="dropdown-item" onClick={()=> setDropValue('Action')} href="#">Action</a></li>
                          <li><a class="dropdown-item" onClick={()=> setDropValue('Another action')} href="#">Another action</a></li>
                          <li><a class="dropdown-item" onClick={()=> setDropValue('Something else here')} href="#">Something else here</a></li>
                        </ul>
                      </div>
                  </div>
                 </>
              }
              
              export default DropDown
              

              【讨论】:

                【解决方案13】:
                <select value ={this.state.value} onChange={this.handleDropdownChange}>
                              <option value="1">1</option>
                              <option value="2">2</option>
                              <option value="3">3</option>
                              <option value="4">4</option>
                              <option value="5">5</option>
                          </select>
                

                【讨论】:

                • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
                最近更新 更多