¿Cómo enviar un formulario usando la tecla Enter en react.js?

102

Aquí está mi formulario y el método onClick. Me gustaría ejecutar este método cuando se presiona el botón Enter del teclado. Cómo ?

NB: No se agradece jquery.

 comment: function (e) {
        e.preventDefault();
        this.props.comment({comment: this.refs.text.getDOMNode().value, userPostId:this.refs.userPostId.getDOMNode().value})
    },


 <form className="commentForm">
     <textarea rows="2" cols="110" placeholder="****Comment Here****" ref="text"  /><br />
    <input type="text" placeholder="userPostId" ref="userPostId" /> <br />
     <button type="button" className="btn btn-success" onClick={this.comment}>Comment</button>
    </form>
Istiak Morsalin
fuente

Respuestas:

193

Cambiar <button type="button"a <button type="submit". Quite el onClick. En su lugar, hazlo <form className="commentForm" onSubmit={this.onFormSubmit}>. Esto debería capturar haciendo clic en el botón y presionando la tecla de retorno.

onFormSubmit = e => {
  e.preventDefault();
  const { name, email } = this.state;
  // send to server with e.g. `window.fetch`
}

...

<form onSubmit={this.onFormSubmit}>
  ...
  <button type="submit">Submit</button>
</form>
Dominic
fuente
2
why onSubmit = {this.onCommentSubmit}>? @Dominic
Istiak Morsalin
1
@JasonBourne puede darle a la devolución de llamada el nombre que desee, yo siempre le doy nombres a las devoluciones de llamada de eventos como onSomethingClick, onMouseMove, onFormKeyPress, etc., en lugar de nombrar el método según lo que se supone que debe hacer dentro de él, ya que a veces eso cambia o está en otro método (más comprobable)
Domingo
2
@JasonBourne este es el método correcto y de mejores prácticas, y funciona en ambos casos, consulte jsfiddle.net/ferahl/b125o4z0
Dominic
26
En onCommentSubmit, también debe llamar event.preventDefault()y event.stopPropagation()para evitar que el formulario vuelva a cargar la página (ya que lo actionmás probable es que sea un formulario con un atributo en blanco )
jamesfzhang
1
Evite la recarga de la página con un action='#'atributo del formelemento.
Terje Norderhaug
17

Utilice el keydownevento para hacerlo:

   input: HTMLDivElement | null = null;

   onKeyDown = (event: React.KeyboardEvent<HTMLDivElement>): void => {
      // 'keypress' event misbehaves on mobile so we track 'Enter' key via 'keydown' event
      if (event.key === 'Enter') {
        event.preventDefault();
        event.stopPropagation();
        this.onSubmit();
      }
    }

    onSubmit = (): void => {
      if (input.textContent) {
         this.props.onSubmit(input.textContent);
         input.focus();
         input.textContent = '';
      }
    }

    render() {
      return (
         <form className="commentForm">
           <input
             className="comment-input"
             aria-multiline="true"
             role="textbox"
             contentEditable={true}
             onKeyDown={this.onKeyDown}
             ref={node => this.input = node} 
           />
           <button type="button" className="btn btn-success" onClick={this.onSubmit}>Comment</button>
         </form>
      );
    }
am0wa
fuente
14

Han pasado bastantes años desde la última vez que se respondió a esta pregunta. React introdujo "Hooks" en 2017, y "keyCode" ha quedado obsoleto.

Ahora podemos escribir esto:

  useEffect(() => {
    const listener = event => {
      if (event.code === "Enter" || event.code === "NumpadEnter") {
        console.log("Enter key was pressed. Run your function.");
        // callMyFunction();
      }
    };
    document.addEventListener("keydown", listener);
    return () => {
      document.removeEventListener("keydown", listener);
    };
  }, []);

Esto registra un oyente en el keydownevento, cuando el componente se carga por primera vez. Elimina el detector de eventos cuando se destruye el componente.

usuario1032613
fuente
9

así es como lo haces si quieres escuchar la tecla "Enter". Hay un accesorio de onKeydown que puede usar y puede leer sobre él en react doc

y aquí hay un código Sandbox

const App = () => {
    const something=(event)=> {
        if (event.keyCode === 13) {
            console.log('enter')
        }
    }
return (
    <div className="App">
        <h1>Hello CodeSandbox</h1>
        <h2>Start editing to see some magic happen!</h2>
        <input  type='text' onKeyDown={(e) => something(e) }/>
    </div>
);
}
Cyrus Zei
fuente