Làm cách nào để gửi biểu mẫu bằng cách sử dụng phím Enter trong react.js?


102

Đây là biểu mẫu của tôi và phương pháp onClick. Tôi muốn thực hiện phương pháp này khi nhấn nút Enter trên bàn phím. Làm sao ?

NB: Không có jquery nào được đánh giá cao.

 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>

Câu trả lời:


191

Thay đổi <button type="button"thành <button type="submit". Loại bỏ onClick. Thay vào đó hãy làm <form className="commentForm" onSubmit={this.onFormSubmit}>. Thao tác này sẽ bắt khi nhấp vào nút và nhấn phím quay lại.

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
tại sao onSubmit = {} this.onCommentSubmit> @Dominic?
Istiak Morsalin

1
@JasonBourne, bạn có thể đặt cho phương thức gọi lại bất kỳ tên nào bạn muốn, tôi chỉ luôn cung cấp các tên gọi lại sự kiện như onSomethingClick, onMouseMove, onFormKeyPress, v.v., thay vì đặt tên cho phương thức dựa trên những gì nó phải làm bên trong nó, vì đôi khi điều đó thay đổi hoặc phương pháp khác (kiểm chứng nhiều hơn)
Dominic

2
@JasonBourne đây là phương pháp thực hành chính xác và tốt nhất và nó hoạt động trong cả hai trường hợp, xem jsfiddle.net/ferahl/b125o4z0
Dominic

25
Ngoài ra onCommentSubmit, bạn cũng nên gọi event.preventDefault()event.stopPropagation()để ngăn biểu mẫu tải lại trang (vì rất có thể nó là biểu mẫu có actionthuộc tính trống )
jamesfzhang 11/02/16

1
Tránh tải lại trang với một action='#'thuộc tính cho formphần tử.
Terje Norderhaug

17

Sử dụng keydownsự kiện để làm điều đó:

   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

Đã khá nhiều năm kể từ khi câu hỏi này được trả lời lần cuối. React đã giới thiệu "Hooks" vào năm 2017 và "keyCode" đã không còn được dùng nữa.

Bây giờ chúng ta có thể viết điều này:

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

Điều này đăng ký một trình nghe trên keydownsự kiện, khi thành phần được tải lần đầu tiên. Nó loại bỏ trình nghe sự kiện khi thành phần bị phá hủy.


nhưng họ có hỗ trợ onKeyDown trên tài liệu? reactjs.org/docs/events.html#keyboard-events
Cyrus Zei

@CyrusZei Key down vẫn đang được sử dụng. Ý tôi keyCodelà không dùng nữa, không phải keydownsự kiện.
user1032613

ahh, sau đó tôi hiểu, xin lỗi vì sự hiểu lầm
Cyrus Zei

9

đây là cách bạn thực hiện nếu bạn muốn nghe phím "Enter". Có một phần mềm hỗ trợ onKeydown mà bạn có thể sử dụng và bạn có thể đọc về nó trong tài liệu phản ứng

và đây là một hộp mã

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>
);
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.