首页  >  问答  >  正文

如何在数组对象的情况下,在onChange事件中更新状态

我有一些状态:

const [budget, setBudget] =
    React.useState<{ name: string; budget: number | null }[]>();

我试图使用一个TextField根据输入字段的名称和值来更新该状态:

budget.map((item) => {
      content.push(
        <TextField
          name={item.name}
          id={item.name}
          label={item.name}
          type="tel"
          onChange={handleChange}
        />
      );
    });

我知道这是一个奇怪的情况,但输入字段不是预先确定的值,所以我必须动态渲染它们,这让生活变得困难。

我尝试了以下的onChange函数,但它不起作用:

const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => () => {
    const newOne = budget?.map((item) =>
      Object.entries(item).map(([key, value]) => {
        if (key === event.target.name) {
          return [key, event.target.value];
        }
        return [key, value];
      })
    );
    setBudget(newOne);
  };

我无意中创建了很多数组,并且得到了以下错误(不确定如何仅返回键和值):

Argument of type '(string | number | null)[][][] | undefined' is not assignable to parameter of type 'SetStateAction<{ name: string; budget: number | null; }[] | undefined>'.

P粉726234648P粉726234648420 天前496

全部回复(1)我来回复

  • P粉993712159

    P粉9937121592023-09-18 15:16:17

    我认为问题在于你在handleChange函数中使用了双箭头函数,这意味着当事件发生时,内部函数实际上并没有被执行。你应该去掉多余的箭头。

    另一个问题是你从map函数中返回了一个数组的数组,这与你的状态类型不兼容。你应该使用Object.fromEntries将数组的数组转换回对象的数组。例如:

    const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {
      const newOne = budget?.map((item) =>
        Object.fromEntries(
          Object.entries(item).map(([key, value]) => {
            if (key === event.target.name) {
              return [key, event.target.value];
            }
            return [key, value];
          })
        )
      );
      setBudget(newOne);
    };

    回复
    0
  • 取消回复