如何在ReactJS中获取下拉菜单的选定值

104

我正在使用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) - dandavis
额外说明:我想使用select并将一个值传递到一个方法中。请仅返回翻译后的文本。 - BlueElixir
1
<select onchange=method(value)>,或者使用更复杂的 off-side 绑定,或者在 JS 中使用 method(drowdown.value) - dandavis
1
请参考此链接:https://www.skptricks.com/2018/05/create-dropdown-using-reactjs.html - Abhisek Mishra
14个回答

129

render方法中的代码代表了组件在任何给定时间的状态。 如果您像这样做,用户将无法使用表单控件进行选择:

<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,同时也展示了如何处理多个选择。


2
嘿,你的回答正是我在寻找的!但是,我不理解 value={this.state.selectValue} 的目的。我查看了文档,它说明:渲染元素的值将始终反映 value 属性。然而,即使我删除了这行代码:value={this.state.selectValue},你的示例似乎也能正常工作。这行代码到底是做什么用的?它与文档中使用 value="Hello!" 的示例有何不同?在我看来,唯一重要的是 handleChange(处理 setState 方法)和 message 变量。 - BlueElixir
1
@desgarron6好问题!在被控制的组件示例中,value = {this.state. selectValue}有效地设置了输入的默认值。这在之前并不清楚,因为“Orange”本来就是默认选项,所以不需要设置。我更新了代码将“Radish”设置为this.state.selectValue的初始值。如果您注释掉您提到的那行,就会得到这个结果:http://jsfiddle.net/f00erjqs/ UI不同步。 - Max Heiber
谢谢!这太完美了。我相信是下拉菜单的性质让橙色成为原始值,这让我感到困惑。感谢您的澄清。 - BlueElixir
1
@desgarron6 当然可以!玩得开心。我建议阅读http://todomvc.com/examples/react/#/源代码,以了解如何处理用户输入。 - Max Heiber
更新:自此回答以来,React API 已经发生了重大变化。 - Max Heiber

24

应该是这样的:

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


19

将下拉框实现为

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

10
我建议避免使用 refs。虚拟DOM的整个目的是将真实DOM抽象出来,但是refs会将你与真实DOM联系起来。这里有更多讨论:https://dev59.com/5V0b5IYBdhLWcg3wLOrP#29504636 和官方文档中也有说明:https://facebook.github.io/react/docs/refs-and-the-dom.html#dont-overuse-refs。另外,请更新您的答案以使用新的ref回调属性API(https://facebook.github.io/react/docs/refs-and-the-dom.html#the-ref-callback-attribute)。 - Max Heiber

14

14
一个代码示例会使这个答案更有价值,特别对于初学者而言。 - Maciej Gurban

8

对于前端开发者而言,我们经常需要处理表单,其中我们需要处理下拉框并使用所选下拉框的值执行某些操作或将该值发送到服务器。非常简单,您只需在HTML中编写简单的下拉菜单,为选择中的一个onChange方法设置一个,每当用户更改下拉菜单的值时,将该值设置为状态,这样您就可以轻松地在AvFeaturedPlayList1中访问它。请记住,您始终会得到选项值而不是显示在屏幕上的下拉文本。

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;

7

使用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>

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

您可以在此网站上查看相关信息。


4

就是这么简单。你只需要使用"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?最好发布整个图片。 - Mustkeem K

4
我正在制作一个语言选择器的下拉菜单,但我需要在页面加载时显示当前语言。 我将从URL参数example.com?user_language=fr获取初始语言,或从用户浏览器设置中检测它。 然后,当用户与下拉菜单交互时,所选语言将更新,并且语言选择器下拉菜单将显示当前选择的语言。
为了回答其他答案使用食品例子的精神,我给你带来各种水果好处。
首先是使用基本React函数组件回答最初提出的问题的两个示例,一个不使用props,另一个接受props fruitDetector,然后介绍如何在其他地方导入该组件。
接下来是同样的示例-但使用了TypeScript。
然后是额外奖励-使用TypeScript的语言选择器下拉组件。
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接受属性,也许你有一个输出字符串的函数,你可以使用fruitDetector属性将其传递。

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

然后在你的应用程序其他地方导入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>
  )
}

React/Typescript不可或缺的资源


2
如果您想从映射的选择输入中获取值,则可以参考此示例:
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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接