จะจัดการกับเหตุการณ์ 'onKeyPress' ใน ReactJS ได้อย่างไร


215

ฉันจะทำให้onKeyPressกิจกรรมทำงานใน ReactJS ได้อย่างไร ควรแจ้งเตือนเมื่อenter (keyCode=13)มีการกด

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 normalizes รหัสคีย์ลงในสตริงที่สามารถอ่านได้ ฉันขอแนะนำให้ใช้สิ่งเหล่านั้นแทนรหัส
แรนดี้มอร์ริส

@RandyMorris ตอบสนองไม่ได้ทำให้ปกติรหัสคีย์อย่างถูกต้อง สำหรับการผลิต "+" จะให้ค่ารหัสคีย์ 187 กับ shiftKey = true อย่างไรก็ตามค่า "คีย์" จะแก้ไขเป็น "ไม่ระบุ"
Herr

คำตอบ:


226

ฉันทำงานกับ React 0.14.7 ใช้onKeyPressและevent.keyทำงานได้ดี

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

18
และคุณสามารถจำลองในการทดสอบด้วย:Simulate.keyPress(ReactDOM.findDOMNode(component.refs.input),{key:"Enter"});
sylvain

2
คุณหมายถึงอะไรโดยการทดลอง ฉันคิดว่า ES6 "functionName (param) => {}" จะใช้งานได้ไหม
Waltari

4
@Waltari มัน ES6 ฟังก์ชั่นลูกศรซึ่งหมายถึงfunction handleKeyPress(event){...}
Haven

2
นอกจากนี้ยังผูกthis
bhathiya-perera

4
บางทีมันอาจจะเป็นความรู้ แต่มันเป็นที่น่าสังเกตว่ามันจะดีกว่าที่จะใช้ความเสมอภาคที่เข้มงวดการตรวจสอบ=== event.key == 'Enter'
Alexander Nied

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

onKeyDownตรวจจับkeyCodeเหตุการณ์


11
โดยปกติสิ่งต่าง ๆ จะถูกตรวจพบคีย์ Enter ผ่าน onKeyUp ซึ่งจะทำให้ผู้ใช้สามารถหยุดการโต้ตอบถ้าเขาตัดสินใจ ใช้ keyPress หรือ keyDown ดำเนินการทันที
Andreas

52

สำหรับผมอยู่เสมอแต่มีค่าที่ถูกต้อง หากใช้รหัสที่ถูกต้องในonKeyPresse.keyCode0e.charCodeonKeyDowne.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>
      );
    }
  });

ตอบสนองต่อเหตุการณ์แป้นพิมพ์


9
.. ดังนั้นหากคุณสนใจที่จะใช้ปุ่มลูกศรและ / หรือคีย์อื่น ๆ ที่ไม่ใช่ตัวอักษรและตัวเลข onKeyDown มีไว้สำหรับคุณเนื่องจากจะไม่ส่งคืน keyChar แต่เป็นรหัสคีย์
oskare

3
สำหรับผู้ที่สนใจทดลองใช้ React key ด้วยตนเองนี่คือรหัสและกล่องจดหมายที่ฉันสร้างขึ้น
AlienKevin

13

เหตุการณ์ Keypress เลิกใช้แล้วคุณควรใช้เหตุการณ์ Keydown แทน

https://developer.mozilla.org/en-US/docs/Web/API/Document/keypress_event

handleKeyDown(event) {
    if(event.keyCode === 13) { 
        console.log('Enter key pressed')
  }
}

render() { 
    return <input type="text" onKeyDown={this.handleKeyDown} /> 
}

1
event.key === 'Enter'นอกจากนี้ยังสนับสนุน ลองดูที่นี่
marcelocra

10

ปฏิกิริยาไม่ได้ผ่านเหตุการณ์แบบที่คุณคิด แต่ก็จะผ่านเหตุการณ์สังเคราะห์

ในการทดสอบสั้น ๆevent.keyCode == 0เป็นจริงเสมอ สิ่งที่คุณต้องการคือevent.charCode


นี่ไม่ได้ส่งผลกระทบต่อคำถาม มันไม่เปลี่ยน keyCode เท่ากับ 13 เมื่อกด Enter
Tequilaman

1
ฉันแค่ดึงฟังก์ชั่นสังเคราะห์กลับมาใช้ใหม่e.key || e.keyCode || e.charCode
chovy


9

หากคุณต้องการส่งพารามิเตอร์แบบไดนามิกไปยังฟังก์ชันภายในอินพุตแบบไดนามิก ::

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

หวังว่านี่จะช่วยใครซักคน :)


7

ไปงานปาร์ตี้สาย แต่ฉันพยายามทำสิ่งนี้ใน TypeScript และคิดสิ่งนี้:

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

พิมพ์คีย์ที่แน่นอนที่กดไปยังหน้าจอ ดังนั้นหากคุณต้องการตอบกลับกด "a" ทั้งหมดเมื่อ div อยู่ในโฟกัสคุณจะเปรียบเทียบ e.key กับ "a" - ตามตัวอักษรถ้า (e.key === "a")


ดูเหมือนจะใช้งานไม่ได้ stackoverflow.com/questions/43503964/…
sdfsdf

5

มีความท้าทายบางอย่างเมื่อมันมาถึงเหตุการณ์สำคัญ บทความของ Jan Wolter เกี่ยวกับเหตุการณ์สำคัญนั้นค่อนข้างเก่า แต่อธิบายได้ดีว่าเหตุใดการตรวจจับเหตุการณ์คีย์จึงยาก

สิ่งที่ควรทราบ:

  1. keyCode, which,charCodeมีค่าแตกต่างกัน / ความหมายในปุ่มกดจาก keyup และ keydown พวกเขาทั้งหมดเลิกใช้อย่างไรก็ตามได้รับการสนับสนุนในเบราว์เซอร์หลัก
  2. ระบบปฏิบัติการแป้นพิมพ์กายภาพเบราว์เซอร์ (รุ่น) อาจมีผลกับรหัส / ค่าคีย์
  3. keyและcodeเป็นมาตรฐานล่าสุด อย่างไรก็ตามเบราว์เซอร์ไม่ได้รับการสนับสนุนในขณะเขียน

เพื่อรับมือกับเหตุการณ์ที่เกิดขึ้นแป้นพิมพ์ในการตอบสนองต่อปพลิเคชันที่ผมดำเนินการตอบสนอง-แป้นพิมพ์ตัวจัดการเหตุการณ์ กรุณาดู


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.