【问题标题】:UseState array Hooks return a new object in every change in the input fieldUseState 数组 Hooks 在输入字段的每次更改中返回一个新对象
【发布时间】:2021-12-14 22:02:26
【问题描述】:

我正在为我正在进行的项目使用 React 钩子。我遇到了一种情况,我想在 useState 挂钩中使用数组,但我不确定如何执行此操作。

我创建了一个表格,它根据一个月的天数动态更改其列数。

我尝试过这样的事情:

const [inText, setInText] = useState([]);
const inputText = (e) => {
    setInText([...inText,{
        id:inText.length,
        value:e.target.value
    }]);
}

numberOfDays 是我计算的一个变量。它包含当月的天数。

const renderINP = () => {
    let td = [];
    for (let i = 1; i <= numberOfDays; i++) {
        td.push(<td key={i}><input type="text" onChange={inputText} /></td>);
    }
    return td;
};

这是将表格呈现给浏览器的代码:

<table>
    <tbody>
        <tr className="work-days">
            <td>Working days</td>
            {renderINP()}
        </tr>
    </tbody>
</table>

我尝试用 cosole.log(inText) 捕捉“inText”。当我在输入中输入某些内容时,例如 0,它会创建一个对象 {id: 0, value: '0'}。当我再次输入时,它会创建两个对象 {id: 0, value: '0'} 和 {id: 1, value: '0.'}。此外,当我删除某些内容时,它会创建另一个对象。

如何为每个输入只创建一个对象,以及如何分别获取每个 inText 的值?例如,在第二个输入中获取 inText 的值,而不是所有对象的值。

【问题讨论】:

  • numberOfItems 是什么?你在哪里设置它?是状态变量吗?
  • 我不太清楚你的意图是什么,但听起来你需要使用 useReducer 而不是 useState。
  • 你的意思是 numberOfDays 我认为,它是一个包含当月天数的变量,我从函数返回当月天数 @AntonioPantano 得到它
  • @code90 例如,如果我想在第一个输入中输入 0.5,它将在数组中创建一个对象,该对象将具有三个不同的 id 和值,值将是“0”和“。”和 '5' ,如何避免这种情况并在数组中只创建一个值为 '0.5' 的对象
  • 对,这就是为什么我说它不会解决您的问题。你需要一个更好的解决方案。 useReducer 应该是要走的路。我可能会在当天晚些时候提供解决方案。

标签: javascript reactjs react-hooks jsx


【解决方案1】:

useState 主要用于保存单个值。在这种情况下,您有一个对象数组,并且想要更新单个对象的值。 useReducer 更可取。

你可以阅读更多关于useReducer

这应该可以满足您的需求:

import React, { useReducer } from "react";

const App = () => {
  const reducer = (state, action) => {
    if (action.type === "ADD") {
      const newState = [...state];
      newState.push({ id: action.id, value: action.value });
      return newState;
    }

    if (action.type === "UPDATE") {
      const newState = [...state];
      const foundItem = newState.find((item) => item.id === action.id);
      foundItem.value = action.value;
      return newState;
    }
  };

  const initialState = [];

  const [state, dispatch] = useReducer(reducer, initialState);

  const numberOfDays = 7;

  const inputText = ({ id, value }) => {
    if (state.find((item) => item.id === id)) {
      dispatch({ type: "UPDATE", id, value });
    } else {
      dispatch({ type: "ADD", id, value });
    }

    console.log(state);
  };

  const renderINP = () => {
    let td = [];
    for (let i = 1; i <= numberOfDays; i++) {
      td.push(
        <td key={i}>
          <input
            type="text"
            onChange={(e) => inputText({ id: i, value: e.target.value })}
          />
        </td>
      );
    }
    return td;
  };

  return (
    <>
      <table>
        <tbody>
          <tr className="work-days">
            <td>Working days</td>
            {renderINP()}
          </tr>
        </tbody>
      </table>

      {JSON.stringify(state)}
    </>
  );
};

export default App;

【讨论】:

  • 解释一下。例如,想法/要点是什么?请通过editing (changing) your answer 回复,而不是在 cmets 中(without "Edit:"、"Update:" 或类似的 - 答案应该看起来像是今天写的)。
猜你喜欢
  • 2022-12-11
  • 2021-07-15
  • 2021-07-11
  • 2020-04-06
  • 1970-01-01
  • 2020-06-03
  • 1970-01-01
  • 2022-10-14
  • 1970-01-01
相关资源
最近更新 更多