如何在 ReactJS 中处理多选表单

IT技术 javascript forms reactjs select
2021-04-27 13:17:11

我尝试在 ReactJS 中处理多表单选择选项我试图受到 javascript 经典代码的启发来处理这个问题,但我失败了。

我的代码只是不向我发送所选的值。怎么处理?

这是我的代码:

  class ChooseYourCharacter extends React.Component {

      constructor(props) {
        super(props);
        this.state = {value: 'coconut'};

        this.handleChange = this.handleChange.bind(this);
        this.handleSubmit = this.handleSubmit.bind(this);
      }

      handleChange(event) {
        this.setState({value: event.option});
      }

      handleSubmit(event) {
        alert('Your favorite flavor is: ' + this.state.value);
        event.preventDefault();
      }

      render() {
        return (
          <form onSubmit={this.handleSubmit}>
            <label>
              Pick your favorite La Croix flavor:
              <select multiple={true} value={this.state.value} onChange={this.handleChange}>
                <option value="grapefruit">Grapefruit</option>
                <option value="lime">Lime</option>
                <option value="coconut">Coconut</option>
                <option value="mango">Mango</option>
              </select>
            </label>
            <input type="submit" value="Submit" />
          </form>
        );
      }
    }
    ReactDOM.render(
             <ChooseYourCharacter/>,
             document.getElementById('root')
    )
4个回答

根据我的基本理解,当您尝试在 reactJS 中处理Select 表单元素时,您会在 HTMLOptionsCollection 中生成一个对象。

此对象方法和属性的基本根是e.target.options

您的项目存储在 e.target.options.value 属性中。

要访问存储在 options.value 对象中的值,您可以使用 [i] 循环值,因此 e.target.options[i].value 属性。

e.target.options[i].value 返回字符串数据类型。

按照我刚才所说的,我假设对象的存储遵循数字递增约定,如下所示:

e.target.options[i].value where { [i] : value, [i +1] : value (...)}...

通过使用 e.target.options[i].selected 您可以控制是否在特定位置存储了值。

e.target.options[i].selected 返回一个布尔值,用于处理代码流。

现在就看你了。


这里我的代码使用 javascript 代码处理 JSX 中的多个选择表单:

// Create the React Component


    class ChooseYourCharacter extends React.Component {

          // Set the constructor
          constructor(props) {
            super(props);
            this.state = {value: 'coconut'};

            // bind the functions
            this.handleChange = this.handleChange.bind(this);
            this.handleSubmit = this.handleSubmit.bind(this);
          }

          // extract the value to fluently setState the DOM
          handleChange (e) {
            var options = e.target.options;
            var value = [];
            for (var i = 0, l = options.length; i < l; i++) {
              if (options[i].selected) {
                value.push(options[i].value);
              }
            }
            this.setState({value: value});
          }

          // display in client-side the values choosen
          handleSubmit() {
             alert("you have choose :" + this.state.value);

         }


    (...)

以下是如何使用功能组件和 useState 挂钩而不是类组件获取用户选择的选项:

import React, { useState } from "react";

const ChooseYourCharacter = function(props) {
    const [selectedFlavors, setSelectedFlavors] = useState([]);

    const handleSelect = function(selectedItems) {
        const flavors = [];
        for (let i=0; i<selectedItems.length; i++) {
            flavors.push(selectedItems[i].value);
        }
        setSelectedFlavors(flavors);
    }

    return (
        <form>
            <select multiple={true} value={selectedFlavors} onChange={(e)=> {handleSelect(e.target.selectedOptions)}}>
                <option value="grapefruit">Grapefruit</option>
                <option value="lime">Lime</option>
                <option value="coconut">Coconut</option>
                <option value="mango">Mango</option>
            </select>
        </form>
    );
};

export default ChooseYourCharacter;

目前正在学习 React,我在reactjs.org 站点上注意到了相同的代码以下是我处理多个选定选项的解决方案。

  1. 在构造函数中,使用数组作为状态中“值”的初始值
  2. 在handleChange方法中,使用Array.from()将事件目标的selectedOptions(HTMLOptionsCollection-array-like)转换为数组,并使用映射函数从每一项中获取值

class ChooseYourCharacter extends React.Component {

      constructor(props) {
        super(props);
        //this.state = {value: 'coconut'};
        this.state = {value: ['coconut']};

        this.handleChange = this.handleChange.bind(this);
        this.handleSubmit = this.handleSubmit.bind(this);
      }

      handleChange(event) {
        //this.setState({value: event.option});
        this.setState({value: Array.from(event.target.selectedOptions, (item) => item.value)});
      }

      handleSubmit(event) {
        alert('Your favorite flavor is: ' + this.state.value);
        event.preventDefault();
      }

      render() {
        return (
          <form onSubmit={this.handleSubmit}>
            <label>
              Pick your favorite La Croix flavor:
              <select multiple={true} value={this.state.value} onChange={this.handleChange}>
                <option value="grapefruit">Grapefruit</option>
                <option value="lime">Lime</option>
                <option value="coconut">Coconut</option>
                <option value="mango">Mango</option>
              </select>
            </label>
            <input type="submit" value="Submit" />
          </form>
        );
      }
    }
    ReactDOM.render(
             <ChooseYourCharacter/>,
             document.getElementById('root')
    )
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<div id="root"></div>

当您使用多选时,您应该将状态变量声明为数组

  constructor(props) {
    super(props);
    this.state = {value: []};//This should be an array

    this.handleChange = this.handleChange.bind(this);
    this.handleSubmit = this.handleSubmit.bind(this);
  }

我创建了一个带有多选控件的 reactjs 表单发布博客。你可以去这里了解更多详情https://handyopinion.com/git-commands-cheat-sheet/