React.js'de Enter tuşunu kullanarak bir form nasıl gönderilir?


103

İşte formum ve onClick yöntemi. Klavyenin Enter butonuna basıldığında bu metodu uygulamak istiyorum. Nasıl ?

NB: Hiçbir jquery takdir edilmiyor.

 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>

Yanıtlar:


195

Değişim <button type="button"için <button type="submit". Kaldır onClick. Bunun yerine yapın <form className="commentForm" onSubmit={this.onFormSubmit}>. Bu, düğmeyi tıklayıp dönüş tuşuna basmayı yakalamalıdır.

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>

2
neden onSubmit = {this.onCommentSubmit}>? @Dominic
Istiak Morsalin

1
@JasonBourne, geri aramayı istediğiniz herhangi bir adı verebilirsiniz, yöntemi içinde ne yapması gerektiğine bağlı olarak adlandırmak yerine, her zaman onSomethingClick, onMouseMove, onFormKeyPress vb. başka bir yöntem (daha test edilebilir)
Dominic

2
@JasonBourne, bu doğru ve en iyi uygulama yöntemidir ve her iki durumda da işe yarar
Dominic

26
İçinde onCommentSubmit, ayrıca çağırmalı event.preventDefault()ve event.stopPropagation()formun sayfayı yeniden yüklemesini engellemelisiniz ( actionbüyük olasılıkla boş bir özniteliğe sahip bir form olduğundan )
jamesfzhang

1
Öğeye bir action='#'öznitelikle sayfanın yeniden yüklenmesinden kaçının form.
Terje Norderhaug

17

keydownBunu yapmak için olayı kullanın :

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

17

Bu sorunun en son yanıtlanmasının üzerinden epeyce yıl geçti. React, 2017'de "Hooks" olarak tanıtıldı ve "keyCode" kullanımdan kaldırıldı.

Şimdi şunu yazabiliriz:

  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);
    };
  }, []);

Bu keydown, bileşen ilk kez yüklendiğinde olaydaki bir dinleyiciyi kaydeder . Bileşen yok edildiğinde olay dinleyicisini kaldırır.


10

"Enter" tuşunu dinlemek istiyorsanız, bu şekilde yaparsınız. Bir onkeydown prop kullanabileceğiniz ve bunu yaklaşık okuyabilmesi yoktur doc tepki

ve işte bir kodSandbox

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>
);
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.