React:动态添加输入文本

React: Dynamically adding an input text

我是 React 新手,尝试在单击“添加项目符号”按钮时添加输入字段(类似于 ToDo 列表功能)。

我的组件是:

  return (
    <Container>
            {bullet.map((text, i) => {
            return (
              <div className="box">
                <p>Bullet {i+1}</p>
                  <input
                    name="Bullet" placeholder="Enter text"
                    value={text} onChange={(event) => {
                      setBullet([event.target.value])
                    }}/>
                    <button onClick={handleAddClick}>Add Bullet</button>
              </div>
            );
            })}

    </Container>
  );
};

问题是函数 handleAddClick 被调用(通过 console.log 检查)但它没有添加新的输入法。我正在使用状态数组进行更新,所以如果有人可以帮助我解决问题,这将很有帮助。

处理添加点击:

const handleAddClick = useCallback(() => {
    setBullet([
      ...bullet, 
      'Lorem Ipsum is simply dummy text'
    ])
  }, [ bullet ]);

更新: 现在修改函数后的问题是,每当我开始在输入框中输入时,它会立即删除所有其他输入框,只保留一个。我将 event.target.value 的值传递给 onChange 函数。

您应该将回调处理程序包装在 useCallback() 中以记住它。目前,每次渲染组件时都会定义您的函数,因此 bullet 的参考值使用的是初始值,而不是更新后的值:

const handleAddClick = useCallback(() => {
  setBullet([
    ...bullet, 
    'Lorem Ipsum is simply dummy text'
  ])
}, [ bullet ]);

我相信您原来的 handleAddClick 处理程序只需要使用功能状态更新来正确更新以前的状态,而不是范围内关闭的任何状态。

const handleAddClick = () => {
  setBullet(bullets => [
    ...bullets,
    'Lorem Ipsum is simply dummy text'
  ]);
};

为了解决更新问题,您将完全替换输入的 onChange 处理程序中的 bullet 状态。

<input
  name="Bullet"
  placeholder="Enter text"
  value={text}
  onChange={(event) => {
    setBullet([event.target.value]) // <-- replaceS the entire array!!
  }}
/>

您需要的是一个处理程序,例如更新特定索引的删除处理程序。

const onChangeHandler = (index: number, value: string) => {
  setBullet(bullets => bullets.map(
    (bullet, i) => i === index ? value : bullet
  )):
}

...

<input
  name="Bullet"
  placeholder="Enter text"
  value={text}
  onChange={e => onChangeHandler(i, e.target.value)}
/>