Перебор массива элементов формы в React - PullRequest
0 голосов
/ 25 февраля 2020

У меня есть функциональный компонент React с формой, при отправке я хочу l oop через все элементы формы ....

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?

Ответы [ 2 ]

2 голосов
/ 25 февраля 2020

Объект elements на самом деле является HTMLFormControlsCollection объектом.

Вы можете использовать метод Array.prototype.forEach для итерации коллекции следующим образом:

Array.prototype.forEach.call(event.target.elements, (element) => {
  console.log(element);
})
0 голосов
/ 25 февраля 2020

event.target.elements вернет undefined

Я предлагаю сделать это реагирующим образом, иметь массив всех элементов формы в состоянии.

 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>
  );
}
...