react.jsでEnterキーを使用してフォームを送信する方法は?


102

これが私のフォームとonClickメソッドです。キーボードのEnterボタンを押したときにこのメソッドを実行したいのですが。どうやって ?

注意: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>

回答:


191

に変更<button type="button"<button type="submit"ます。を取り外しますonClick。代わりに<form className="commentForm" onSubmit={this.onFormSubmit}>。これにより、ボタンのクリックとリターンキーの押下がキャッチされます。

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
なぜonSubmit = {this.onCommentSubmit}>?@Dominic
Istiak Morsalin

1
@JasonBourneコールバックに任意の名前を付けることができます。イベントコールバックには、内部で何をするかということに基づいてメソッドに名前を付けるのではなく、onSomethingClick、onMouseMove、onFormKeyPressなどの名前を常に付けます。別の方法(よりテスト可能)
ドミニク、

2
@JasonBourneこれは正しいベストプラクティスの方法であり、両方のインスタンスで機能します。jsfiddle.net/ ferahl / b125o4z0を
Dominic

25
ではonCommentSubmit、あなたも呼び出す必要がありますevent.preventDefault()し、event.stopPropagation()(空白でその形態以来、ページを再読み込みからフォームを防ぐために、action最も可能性の高い属性)
jamesfzhang

1
要素のaction='#'属性を使用してページを再読み込みしないでくださいform
Terje Norderhaug

17

keydownイベントを使用して実行します。

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

14

この質問が最後に回答されてからかなり数年になります。Reactは2017年に「フック」を導入し、「keyCode」は非推奨になりました。

これで次のように書くことができます:

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

これによりkeydown、コンポーネントが初めてロードされるときに、イベントのリスナーが登録されます。コンポーネントが破棄されると、イベントリスナーが削除されます。


しかし、ドキュメントにonKeyDownプロップがありますか? reactjs.org/docs/events.html#keyboard-events
Cyrus

@CyrusZei Key downはまだ使用されています。私が意味するものkeyCodeではなく、廃止されましたkeydownイベント。
user1032613

ああ、それではわかりました、誤解して申し訳ありません
Cyrus Zei

9

これは、「Enter」キーをリッスンする場合の方法です。使用できるonKeydownプロップがあり、反応ドキュメントでそれを読むことができます

そしてこれが codeSandboxです

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>
);
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.