1

我有一个带有表单的 React 功能组件,onSubmit 我想遍历所有表单元素......

export default function TransactionFilter() {

return (
   <form onSubmit={handleSubmit}>
      <TextField id="username" /><br/>
      <TextField id="password" /><br/>
   </form>
)

const handleSubmit = (event) => {
        event.preventDefault();
        var formElements = event.target.elements

        formElements.forEach(element => 
          console.log(`I found this ${element}`)
        );

但是这段代码给了我一个错误......

react-dom.development.js:476 Uncaught TypeError: formElements.forEach is not a function
    at handleSubmit (FilterForm.js:49)
    at HTMLUnknownElement.callCallback (react-dom.development.js:337)

我没有以正确的方式使用forEach吗?如果不是,那么在 React 中迭代表单元素数组的正确方法是什么?

4

3 回答 3

2

元素对象实际上是一个HTMLFormControlsCollection对象。

您可以使用该Array.prototype.forEach方法来迭代集合,如下所示:

Array.prototype.forEach.call(event.target.elements, (element) => {
  console.log(element);
})
于 2020-02-25T17:38:52.427 回答
0

event.target.elements将返回未定义

我建议以反应的方式来做,有一个包含所有表单元素的数组。

 export default function TransactionFilter() {
  const [formData, setFormData] = React.useState([
    { id: 'username', value:'' },
    { id: 'password', value:'' }
  ]);
  const handleSubmit = (event) => {
    event.preventDefault();
    formData.forEach(element => 
      console.log(`I found this ${element.value}`)
    );
  };
  return (
       <form onSubmit={handleSubmit}>
          {formData.map((element, index) => {
            return ( <React.Fragment>
                     <TextField id={element.id} value={element.value} 
                     onChange={e => {
                       setFormData(
                         [
                           ...formData.slice(0, index), 
                           { ...formData[index], value: e.target.value },
                           ...formData.slice(index + 1)
                         ]
                       );
                     }}

                     />
                     <br/>
                   </React.Fragment>
            );
          })}
       </form>
  );
}
于 2020-02-25T17:41:58.440 回答
0

您还可以使用以下of语法:

const handleSubmit = event => {
    event.preventDefault()

    for (const element of event.target.elements) {
        console.log(`I found this ${element}`)
    }
}

    
   
于 2020-12-07T14:11:46.553 回答