Программная отправка формы с использованием javascript не вызывает правильную функцию

#javascript #reactjs #forms #this

Вопрос:

Вероятно, это проблема с привязкой, но я, похоже, не могу найти причину.

Случается, что я использую ReactJS для создания компонента формы, который должен отправляться, когда для параметра «shouldSubmit» установлено значение true. Тем не менее, когда я пишу приведенный ниже код, я не могу получить правильную цепочку событий, и «submitHandler» никогда не выполняется:

obs: что касается useRef, я гарантирую, что компонент всегда будет смонтирован при вызове события отправки, так что здесь нет проблем.

 import React, { useRef } from 'react'

import classes from './CreateEventForm.module.css'

const CreateEventForm = ({ shouldSubmit }) => {
  const form = useRef(null)
  const title = useRef(null)
  const desc = useRef(null)
  const price = useRef(null)

  const submitHandler = () => {
    console.log('entered submitHandler')
  }

  if (shouldSubmit){
    form.current.submit()
  }

  return (
    <form ref={form} className={classes.Form} onSubmit={(e)=>{submitHandler(e)}}>
    <div className={classes.FormControl}>
      <label htmlFor='title'>Título</label>
      <input type='text' id='title' ref={title}/>
    </div>
    <div className={classes.FormControl}>
      <label htmlFor='desc'>Descrição</label>
      <input type='text' id='desc' ref={desc}/>
    </div>
    <div className={classes.FormControl}>
      <label htmlFor='price'>Preço</label>
      <input type='text' id='price' ref={price}/>
    </div>
  </form>
  );
};

export default CreateEventForm;
 

Сначала я подумал, что достаточно просто использовать анонимную функцию для события «onSubmit» формы, чтобы сделать это правильно, когда произошло событие отправки. Но сейчас я сильно чувствую, что проблема в том, что мне нужно привязать «form.current.submit» к «этому», прежде чем вызывать его, но отсутствие опыта мешает мне это сделать. Какая-нибудь помощь?

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

 import React, { useRef } from 'react'

import classes from './CreateEventForm.module.css'

const CreateEventForm = ({onSubmit, shouldSubmit}) => {
  const form = useRef(null)
  const title = useRef(null)
  const desc = useRef(null)
  const price = useRef(null)

  const submitHandler = () => {
    console.log('entered submitHandler')
  }

  if (shouldSubmit){
    submitHandler()
  }

  return (
    <form ref={form} className={classes.Form}>
    <div className={classes.FormControl}>
      <label htmlFor='title'>Título</label>
      <input type='text' id='title' ref={title}/>
    </div>
    <div className={classes.FormControl}>
      <label htmlFor='desc'>Descrição</label>
      <input type='text' id='desc' ref={desc}/>
    </div>
    <div className={classes.FormControl}>
      <label htmlFor='price'>Preço</label>
      <input type='text' id='price' ref={price}/>
    </div>
  </form>
  );
};

export default CreateEventForm;
 

Я был бы признателен за любую информацию!