如何在 react.js 中使用 Enter 键提交表单?

IT技术 reactjs reactjs-flux
2021-04-13 05:52:43

这是我的表单和 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>
6个回答

更改<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>
是的,没有类型的表单内的按钮将默认为“提交”^
2021-05-26 05:52:43
@JasonBourne 这是正确和最佳实践方法,它适用于两种情况,请参阅jsfiddle.net/ferahl/b125o4z0
2021-05-29 05:52:43
为什么 onSubmit={this.onCommentSubmit}> ?@Dominic
2021-06-10 05:52:43
@JasonBourne 你可以给回调任何你想要的名字,我总是给事件回调命名,比如 onSomethingClick、onMouseMove、onFormKeyPress 等,而不是根据它应该在里面做什么来命名方法,因为有时它会改变或在另一种方法(更可测试)
2021-06-11 05:52:43
在 中onCommentSubmit,您还应该调用event.preventDefault()event.stopPropagation()以防止表单重新加载页面(因为它的表单action最有可能具有空白属性)
2021-06-11 05:52:43

距离上次回答这个问题已经有好几年了。React 在 2017 年引入了“Hooks”,而“keyCode”已被弃用。

现在我们可以这样写:

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

keydown当组件第一次加载时,这会在事件上注册一个监听器当组件被销毁时,它会删除事件侦听器。

@vulpxn 这是一个很好的观点!大多数人可能不想执行默认操作,因此我现在编辑了我的答案以包含此行。
2021-05-25 05:52:43
同样,对于那些试图阻止Enter 键触发表单提交的人,请使用event.preventDefault()作为替代callMyFunction()
2021-05-28 05:52:43
这个方法不能在 React 类中使用。另外要明确的是,已弃用的 keyCode 是 DOM keyCode:developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode not part of React
2021-06-14 05:52:43
我试图让它提交一个 formData useState() 钩子 - 但它正在提交“默认”值 - 我假设它本质上是一个闭包,只能使用listener定义时的值(?) - 我应该只是触发点击提交按钮?或者有没有办法直接调用 executeSearch() 函数,但它是否使用更新的 formData 状态?
2021-06-19 05:52:43

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

如果您想听“Enter”键,这就是您的方法。您可以使用一个 onKeydown props,您可以在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>
);
}
这很有效,但在 2020 年“event.keyCode”贬值,请使用“event.key”。此外,如果您正在侦听“Enter”键,则为:“event.key ===“Enter”
2021-05-31 05:52:43
import React, { useEffect, useRef } from 'react';

function Example() {

    let inp = useRef();
    useEffect(() => {
        if (!inp && !inp.current) return;
        inp.current.focus();
        return () => inp = null;
    });

    const handleSubmit = () => {
        //...
    }

    return (
        <form
            onSubmit={e => {
                e.preventDefault();
                handleSubmit(e);
            }}
        >
            <input
                name="fakename"
                defaultValue="...."
                ref={inp}
                type="radio"
                style={{
                    position: "absolute",
                    opacity: 0
                }}
            />
            <button type="submit">
                submit
            </button>
        </form>
    )
}

有时在弹出窗口中在此处输入代码,仅绑定表单并将 onSubmit 传递给表单是行不通的,因为表单可能没有任何输入。

在这种情况下,如果您通过这样做document.addEventListener事件绑定到文档, 则会导致应用程序的其他部分出现问题。

为了解决这个问题,我们应该包装一个表单,并应该输入一个包含 css 隐藏内容的输入,然后您通过 ref 专注于该输入,它将正常工作。