javascript - 如何从对象类型 State 的字段捕获 onChange 事件

标签 javascript reactjs typescript react-hooks onchange

我无法从本身包含多个对象字段的对象捕获 onChange 事件。

这是我的 useState Hook 。

    const [train, setTrain] = useState({
    trainNumber: "",
    trainName: "",
    fromStation: "",
    toStation: "",
    departureDateTime: "",
    arrivalDateTime: "",
//unable to capture travelDetails property changes.
    travelDetails: {   
      coachesClass: [
        {
          availableTickets: "",
          travelClass: "",
          fare: "",
        },
      ],
    },
  });

假设我想检查 tripDetails.coachesClass[0].availableTickets 的 onChange 事件,那么该怎么做?

        <div className="row">
          <label htmlFor="availableTickets">First AC</label>
          <div className="col-4">
            <input
              type="number"
              name="availableTickets"
              className="form-control"
              placeholder="Available Tickets"
              required
              value={train.travelDetails.coachesClass[0].availableTickets}
              onChange={(e) => handleChange(e)}
            />
          </div>

这是 onChangeHandler

const handleChange = (e) => {
const { name, value } = e.target;
setTrain((prevState) => {
  return {
    ...prevState,
    [name]: value,
  };
});

};

它对于其他字段工作正常,但在 TravelDetails 内部它没有捕获更改。

最佳答案

由于您尝试更新嵌套在对象内的数组中的属性,因此需要调整更新状态的方式。尝试这样的事情:

  const handleChange = (e) => {
    setTrain((prevState) => {
      const newCoachesClass = [...prevState.travelDetails.coachesClass];
      newCoachesClass[0] = {
        ...prevState.travelDetails.coachesClass[0],
        availableTickets: e.target.value
      };
      return {
        ...prevState,
        travelDetails: {
          ...prevState.travelDetails,
          coachesClass: newCoachesClass
        }
      };
    });
  };

此外,由于您的输入数字类型,您可能希望将availableTickets初始化为数字而不是字符串:

const [train, setTrain] = useState({
    trainNumber: "",
    trainName: "",
    fromStation: "",
    toStation: "",
    departureDateTime: "",
    arrivalDateTime: "",
    travelDetails: {   
      coachesClass: [
        {
          availableTickets: 0,
    ...

查看此 codepen 的示例:Edit React-Update-Nested-State-Array

关于javascript - 如何从对象类型 State 的字段捕获 onChange 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72033033/

相关文章:

javascript - React - 在 DOM 中多次使用完全相同的组件实例

angular - 拦截 HttpErrorResponse 并将用户重定向到登录页面

javascript - 如何在 Node.js 和 TypeScript 中构建可读流?

javascript - 如何通过单击另一个链接来打开切换功能

javascript - 通过 jQuery 更改鼠标悬停时的动态按钮文本

reactjs - 使用 lodash/fp 映射和第二个参数重构小函数

javascript - 将 socket.io 与 React 结合使用

angular - NullInjectorError : No provider for DecimalPipe

javascript - HTML 选择框显示在 Chrome 中的 Windows 任务栏下方

javascript - 根据时区偏移计算另一个国家的时间