【问题标题】:Get value of select menus when clicking reset button React单击重置按钮时获取选择菜单的值 React
【发布时间】:2022-01-12 00:10:25
【问题描述】:

我有一组选择菜单,当我使用重置按钮重置它们时,我需要找出所有这些菜单的值。

问题是这仅适用于选项的更改事件,我无法使其在第一次单击时对重置按钮起作用,因为它没有检测到更改。

此处的代码示例: https://stackblitz.com/edit/react-rmp8kf

import React from 'react';
import { useState } from 'react';
import uuid from 'react-uuid';

export default function Select() {
  const [value, setValue] = useState({
    select1: '',
    select2: '',
  });
  const selectOptions = [
    {
      options: [
        {
          text: 'All',
          value: '0',
        },
        {
          text: 'Blue',
          value: '1',
        },
        {
          text: 'Yellow',
          value: '2',
        },
        {
          text: 'Green',
          value: '3',
        },
      ],
    },
    {
      options: [
        {
          text: 'All',
          value: '0',
        },
        {
          text: 'Black',
          value: '1',
        },
        {
          text: 'White',
          value: '2',
        },
      ],
    },
  ];

  const handleOnChange = (e) => {
    const valueSelected = e.target.value;
    setValue({
      ...value,
      [e.target.name]: valueSelected,
    });
    printAllSelectValues();
  };

  const resetAllSelections = (e) => {
    e.preventDefault();
    setValue({
      select1: '',
      select2: '',
    });
    printAllSelectValues();
  };

  const resetSelection = (e) => {
    e.preventDefault();
    setValue({
      ...value,
      [e.target.dataset.selectName]: '',
    });
    printAllSelectValues();
  };

  const printAllSelectValues = () => {
    const selectMenus = document.querySelectorAll('select');
    selectMenus.forEach((select) =>
      console.log(select.name + '=' + select.value)
    );
  };

  return (
    <form>
      <div>
        <label>
          <select
            name="select1"
            value={value.select1}
            onChange={handleOnChange}
          >
            {selectOptions[0].options.map((option) => (
              <option value={option.value} key={uuid()}>
                {option.text}
              </option>
            ))}
          </select>
        </label>
        <button data-select-name="select1" onClick={resetSelection}>
          Reset
        </button>
      </div>

      <div>
        <label>
          <select
            name="select2"
            value={value.select2}
            onChange={handleOnChange}
          >
            {selectOptions[1].options.map((option) => (
              <option value={option.value} key={uuid()}>
                {option.text}
              </option>
            ))}
          </select>
        </label>
        <button data-select-name="select2" onClick={resetSelection}>
          Reset
        </button>
      </div>

      <button onClick={resetAllSelections}>Reset All</button>
    </form>
  );
}

【问题讨论】:

    标签: javascript reactjs select reset react-forms


    【解决方案1】:

    您链接的 stackblitz 沙箱似乎完全可以满足您的需求。在以下情况下,您将正确获取这两个值:

    1. 您可以在 2 个选择元素中的任意一个中选择任意值
    2. 您可以使用每个选择元素侧面的重置按钮单独重置任何选择值
    3. 您可以使用“全部重置”按钮一次性重置这两个值

    有什么问题?您想获取更新后的值吗?

    更新

    好的。所以 react 具有每个状态更新都是异步的性质,这意味着您需要等待状态更新发生才能使用其更新的值。现在,您不能使用 Promise 或 async/await 来执行此操作,因为 react 是故意以这种方式构建的,并为您提供了执行此操作的工具。所以你需要为此使用 useEffect 钩子。

    https://stackblitz.com/edit/react-bekzpz

    注意:值得一提的是,你不需要从 HTML 元素中获取数据,但如果你想在 react 中操作 DOM 元素,你不应该使用文档,而是使用 useRef 钩子

    【讨论】:

    • 是的,我需要更新的值。而这只发生在 onChange 事件中。但我也需要在点击时重置更新值。
    • 我认为您没有检查控制台。单击重置时我没有得到更新的值,这就是问题所在。我得到了以前的值。
    • 再次检查我的答案
    • 很好,似乎可以按我的意愿工作!非常感谢。我知道'refs'并在这种情况下尝试过,但没有使用useEffect!我是 React 的新手,并试图习惯在 React 中思考。非常感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-19
    • 2018-03-20
    • 1970-01-01
    • 1970-01-01
    • 2013-09-25
    • 1970-01-01
    相关资源
    最近更新 更多