Làm thế nào để xử lý sự kiện `onKeyPress` trong ReactJS?


214

Làm cách nào để tôi có thể làm cho onKeyPresssự kiện hoạt động trong ReactJS? Nó sẽ cảnh báo khi enter (keyCode=13)được nhấn.

var Test = React.createClass({
    add: function(event){
        if(event.keyCode == 13){
            alert('Adding....');
        }
    },
    render: function(){
        return(
            <div>
                <input type="text" id="one" onKeyPress={this.add} />    
            </div>
        );
    }
});

React.render(<Test />, document.body);

15
v0.11 React bình thường hóa các mã khóa thành các chuỗi có thể đọc được. Tôi khuyên bạn nên sử dụng chúng thay vì keyCodes.
Randy Morris

@RandyMorris phản ứng không phải lúc nào cũng bình thường hóa mã khóa chính xác. Để tạo "+" sẽ cung cấp cho bạn giá trị mã khóa là 187 với shiftKey = true tuy nhiên giá trị "khóa" sẽ phân giải thành "Không xác định".
Herr

Câu trả lời:


225

Tôi đang làm việc với React 0.14.7, sử dụng onKeyPressevent.keyhoạt động tốt.

handleKeyPress = (event) => {
  if(event.key === 'Enter'){
    console.log('enter press here! ')
  }
}
render: function(){
     return(
         <div>
           <input type="text" id="one" onKeyPress={this.handleKeyPress} />
        </div>
     );
}

17
và bạn có thể mô phỏng nó trong các thử nghiệm với:Simulate.keyPress(ReactDOM.findDOMNode(component.refs.input),{key:"Enter"});
sylvain

2
Bạn có ý nghĩa gì bởi thí nghiệm? Tôi nghĩ với ES6 "functionName (param) => {}" sẽ hoạt động?
Waltari

4
@Waltari Đó là chức năng mũi tên ES6 , có nghĩa làfunction handleKeyPress(event){...}
Haven

2
Nó cũng liên kếtthis
bhathiya-perera

4
Có lẽ nó mang tính mô phạm, nhưng đáng chú ý là nên sử dụng ===kiểm tra bình đẳng nghiêm ngặt event.key == 'Enter'.
Alexander Nied

52
render: function(){
     return(
         <div>
           <input type="text" id="one" onKeyDown={this.add} />
        </div>
     );
}

onKeyDownphát hiện keyCodesự kiện.


11
Thông thường, một điều như phím enter được phát hiện thông qua onKeyUp - điều này cho phép người dùng dừng tương tác nếu anh ta quyết định. sử dụng keyPress hoặc keyDown sẽ thực thi ngay lập tức.
Andreas

51

Đối với tôi onKeyPresssự e.keyCodeluôn luôn là 0, nhưng e.charCodecó giá trị đúng. Nếu sử dụng onKeyDownđúng mã trong e.charCode.

var Title = React.createClass({
    handleTest: function(e) {
      if (e.charCode == 13) {
        alert('Enter... (KeyPress, use charCode)');
      }
      if (e.keyCode == 13) {
        alert('Enter... (KeyDown, use keyCode)');
      }
    },
    render: function() {
      return(
        <div>
          <textarea onKeyPress={this.handleTest} />
        </div>
      );
    }
  });

Phản ứng sự kiện bàn phím .


9
..như nếu bạn quan tâm đến việc sử dụng các phím mũi tên và / hoặc các phím không chữ và số khác, onKeyDown là dành cho bạn vì chúng sẽ không trả về một keyChar mà là keyCode.
oskare

3
Đối với những người quan tâm đến việc dùng thử React keyEvents, đây là một hộp mã tôi đã tạo.
AlienKevin


10

React không truyền cho bạn loại sự kiện bạn có thể nghĩ. Thay vào đó, nó đang vượt qua các sự kiện tổng hợp .

Trong một thử nghiệm ngắn, event.keyCode == 0luôn luôn đúng. Những gì bạn muốn làevent.charCode


Điều này không ảnh hưởng đến câu hỏi mặc dù. Nó không thay đổi keyCode bằng 13 khi nhấn Enter.
Tequilaman

1
tôi chỉ tiếp tục lấy lại các chức năng tổng hợp choe.key || e.keyCode || e.charCode
chovy

10
var Test = React.createClass({
     add: function(event){
         if(event.key === 'Enter'){
            alert('Adding....');
         }
     },
     render: function(){
        return(
           <div>
            <input type="text" id="one" onKeyPress={(event) => this.add(event)}/>    
          </div>
        );
     }
});

9

Nếu bạn muốn truyền thông số động cho một hàm, bên trong đầu vào động ::

<Input 
  onKeyPress={(event) => {
    if (event.key === "Enter") {
      this.doSearch(data.searchParam)
    }
  }}
  placeholder={data.placeholderText} />
/>

Hy vọng điều này sẽ giúp được ai đó. :)


7

Đến bữa tiệc muộn, nhưng tôi đã cố gắng hoàn thành việc này trong TypeScript và nghĩ ra điều này:

<div onKeyPress={(e: KeyboardEvent<HTMLDivElement>) => console.log(e.key)}

Điều này in phím chính xác được nhấn vào màn hình. Vì vậy, nếu bạn muốn phản hồi tất cả "a" nhấn khi div nằm trong tiêu điểm, bạn sẽ so sánh e.key với "a" - theo nghĩa đen nếu (e.key === "a").


Điều này dường như không hoạt động. stackoverflow.com/questions/43503964/ từ
sdfsdf

5

Có một số thách thức khi nói đến sự kiện nhấn phím. Bài viết của Jan Wolter về các sự kiện chính hơi cũ nhưng giải thích rõ tại sao việc phát hiện sự kiện chính có thể khó khăn.

Một số điều cần lưu ý:

  1. keyCode, which, charCodeCó giá trị khác nhau / ý nghĩa trong bấm phím từ KeyUp và KeyDown. Tất cả đều không dùng nữa, tuy nhiên được hỗ trợ trong các trình duyệt chính.
  2. Hệ điều hành, bàn phím vật lý, trình duyệt (phiên bản) đều có thể có tác động đến mã / giá trị chính.
  3. keycodelà tiêu chuẩn gần đây. Tuy nhiên, chúng không được hỗ trợ tốt bởi các trình duyệt tại thời điểm viết.

Để giải quyết các sự kiện bàn phím trong các ứng dụng phản ứng, tôi đã triển khai trình xử lý sự kiện bàn phím . Xin hãy xem.


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.