html 当我点击一个选择选项时得到一个TypeError,错误:availabletimes.map不是函数[已关闭]

mwyxok5s  于 2023-03-27  发布在  其他
关注(0)|答案(1)|浏览(107)

**已关闭。**此问题为not reproducible or was caused by typos。当前不接受答案。

这个问题是由打字错误或无法再重现的问题引起的。虽然类似的问题在这里可能是on-topic,但这个问题的解决方式不太可能帮助未来的读者。
4天前关闭。
Improve this question

import { useState } from 'react';

export default function BookingPage() {
    const [firstname, setFirstName] = useState("");
    const [lastname, setLastName] = useState("");
    const [numofguests, setNumOfGuests] =  useState(0);
    const [date, setDate] = useState();
    const [availabletimes, setAvailableTimes] = useState(['6:00pm', '7:00pm', '8:00pm', '9:00pm', '10:00pm']);

    const checkDate = (e) => {
        setDate(e.target.value)
        console.log(date)
    }

    return(
        <>
        <form>
            <div>
                <label htmlFor="name">Name</label>
                <input
                    value={firstname}
                    onChange={(e)=>{setFirstName(e.target.value)}}
                    type="text"
                    id="name"
                    required
                ></input>
                <label htmlFor="lastname">Last Name</label>
                <input
                    value={lastname}
                    onChange={(e)=>{setLastName(e.target.value)}}
                    type="text"
                    id="lastname"
                    required
                ></input>
            </div>
            <div>
                <label htmlFor="date">Date</label>
                <input
                    value={date}
                    onChange={checkDate}
                    type="date"
                    id="date"
                ></input>
            </div>
            <div>
                <label htmlFor="time-res"></label>
                <select
                    multiple={true}
                    value={availabletimes}
                    onChange={(e) => {setAvailableTimes(e.target.value)}}
                    id="time-res"
                >
                    <option>Choose a time!</option>
                    {availabletimes.map((timeoption) => {
                        return (<option >{timeoption}</option>)
                    })}
                </select>
            </div>

            <div>
                <label htmlFor="numOfGuests">Number of Guests</label>
                <input
                    value={numofguests}
                    onChange={(e)=>{setNumOfGuests(e.target.value)}}
                    id="numOfGuests"
                    type="number"
                    min="1"
                    max="10"
                ></input>
            </div>
            <div>
                <label htmlFor="occasion">Dropdown</label>
                <select id="occasion">
                    <option>Birthday</option>
                    <option>Birthday</option>
                </select>
            </div>
            <input type="submit"></input>
        </form>
        </>
    );
};

上面我有一个可用时间的数组。我将数组选项Map到选项标签中。当我尝试单击其中一个选项时,会出现TypeError,说“availabletimes.map不是一个函数”。基本上,我希望它这样,select标签的行为方式就像我手动放入每个选项标签一样。

icnyk63a

icnyk63a1#

单击时间时,将运行以下代码:

onChange={(e) => {setAvailableTimes(e.target.value)}}

这将availabletimes设置为选定值(比如"6.00pm")。从那时起,availabletimes的类型为String
要获取multiselect的值,可以使用以下代码段:

[...e.target.selectedOptions].map(o => o.value)

更广泛地说,您需要重新构造代码,以将用户选择保存为单独的状态变量。以下是工作解决方案(分解为相关位):

import { useState } from "react";

export default function BookingPage() {
  const availabletimes = [
    "6:00pm",
    "7:00pm",
    "8:00pm",
    "9:00pm",
    "10:00pm"
  ];
  const [selectedTime, setSelectedTime] = useState(["6:00pm"])

  return (
    <>
      <form>
        <div>
          <label htmlFor="time-res"></label>
          <select
            multiple={true}
            value={selectedTime}
            onChange={(e) => {
              setSelectedTime([...e.target.selectedOptions].map(o => o.value))
            }}
            id="time-res"
          >
            <option>Choose a time!</option>
            {availabletimes.map((timeoption) => {
              return <option key={timeoption}>{timeoption}</option>;
            })}
          </select>
        </div>
      </form>
    </>
  );
}

相关问题