如何使用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>

Answers:


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等,而不是根据应该在其中执行的操作来命名方法,因为有时它会更改或在其中另一种方法(更具测试性)
Dominic

2
@JasonBourne,这是正确的最佳实践方法,它在两种情况下均有效,请参阅jsfiddle.net/ferahl/b125o4z0
Dominic

25
在中onCommentSubmit,您还应该调用event.preventDefault()event.stopPropagation()防止该表单重新加载该页面(因为该表单action最有可能具有空白属性)
jamesfzhang 2016年

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年推出了“ Hooks”,而“ 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按下按键仍在使用。我的意思keyCode是不赞成使用,而不是keydown事件。
user1032613 '19

嗯,那么我明白了,对不起您的误解
Cyrus Zei

9

如果您想听“ Enter”键,这就是您的方法。有一个onKeydown道具可以使用,您可以在其中阅读 react doc中

这是一个 代码沙盒

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>
);
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.