【问题标题】:How to capture value selected from a dropdown list?如何捕获从下拉列表中选择的值?
【发布时间】:2022-01-16 11:18:44
【问题描述】:

我有一个使用 React JS 创建的简单表单。我有 2 个文本字段,类型和年份,以及一个下拉列表,即汽车。使用来自 API 的值填充汽车下拉列表。用户为前 2 个字段输入文本值,然后从下拉菜单中选择 car 的值并点击添加。我有另一个帖子 API 可以捕获这个值。我可以存储和设置文本框的值,但对于下拉列表,汽车的值没有被捕获,我得到一个空值。如何像存储其他 2 个文本框一样存储 car 的值

import { useHistory } from "react-router-dom";
import axios from "axios";
import React,{useState,useEffect} from 'react';

function NewCar() {

  const [type, setType] = useState("");
  const [year, setYear] = useState("");
  const [car, setCar] = useState("");
  let history = useHistory();

  const [entries,setEntries]=useState([])
  
  useEffect(() => {
    fetchValues();
  }, [])

  useEffect(() => {
    console.log(entries)
  }, [entries])
  
  const fetchValues = async()=>{
    const response = await axios('http://localhost:8080/cars');
    setEntries(response.data)
  }

  const onSubmit = function (e) {
    e.preventDefault();
    axios
      .post("http://localhost:8080/update", {
        type,
        year,
        car
      })
      .then(() => history.push("/"));
  };

  return (
    <form onSubmit={onSubmit}>
    <table border="1">
      Type:{" "}
      <input
        name="type"
        value={type}
        onChange={(e) => setType(e.target.value)}
      />
      <br />
      Year:{" "}
      <textarea
        name="year"
        value={year}
        onChange={(e) => setYear(e.target.value)}
      ></textarea>{" "}
      <br />
      <label for="car">Car:</label>
        <select id="car" name="car">
          {entries.map((entry) => (
             <option value={entry.name}>{entry.name}</option>
          ))}
          name="car"
          value={car}
          onChange={(e) => setCar(e.target.value)}
       </select>
      <br />
    </table>
      <button>Add</button>
    </form>
  );
}

export default NewCar;


【问题讨论】:

  • 使用 onChange 来选择你正在做的输入。 Select 将从其选项中获取其值。 Exarcise :尝试添加一些值来选择,如果您会发现默认选择具有该值的选项。
  • 这是一个错误的“react-native”标签吗?在我看来像 HTML。
  • 嗨@jnpdx 如果我没记错的话,react 和 react-native 的语法几乎相同;唯一的区别是在应用程序上使用了 react-native。也许他正在使用 react-native。
  • @MohammadKhan 在某种意义上你是正确的(React 部分非常相似),但是诸如“form”“table”“br”“input”等实体都是 HTML 实体,未在 React Native 中使用(除非从某种第三方包中导出)。
  • @jnpdx 哦,我明白了。我的错。我认为最好删除 react-native 标签,因为它不是本文的重点。感谢您以如此友好的方式向我解释或证明您:))

标签: javascript html css reactjs


【解决方案1】:

我相信您在代码中将属性放在 select 标记之外是错误的,它应该看起来像这样:

  <select
    id="car"
    name="car"
    value={car}
    onChange={(e) => setCar(e.target.value)}
  >
    {entries.map((entry) => (
      <option value={entry.name}>{entry.name}</option>
    ))}
  </select>

我有这个示例,您可以在其中获取选择标记或下拉列表的值,希望您可以从中参考。

const [dataItem, setDataItem] = useState("");

  const data = [
    {
      name: "Ford",
      year: "1903",
    },
    {
      name: "Chevy",
      year: "1904",
    },
    {
      name: "Dodge",
      year: "1905",
    },
    {
      name: "Honda",
      year: "1906",
    },
    {
      name: "Toyota",
      year: "1907",
    },
  ];

  return (
    <>
      {dataItem}
      <select
        name="dataItem"
        value={dataItem}
        onChange={(e) => setDataItem(e.target.value)}
      >
        {data.map(({name}) => (
          <option value={name}>{name}</option>
        ))}
      </select>
    </>
  );

如果仍然出错,请告诉我并在下面写评论。

【讨论】:

  • 这似乎不起作用。仍然从下拉选择中获取空值
  • 嗨@RiteshSinha,你能给我一张截图或你的结果图片吗?
  • 我没有看到任何错误。当我检查 API 的日志时,所有其他字段都具有我提供的值,但该字段获得空值。这意味着 setCar 无法设置 car 的值
  • 我明白了,所以基本上在这里你试图编辑然后更新数据,所以你试图获取选择字段的值但显示为空?我说的对吗?
  • 您的解决方案看起来正确,但不知何故无法适用于我的用例
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-24
  • 2015-12-30
相关资源
最近更新 更多