Saya ingin menggunakan acara keyDown pada div di React. Saya melakukan:
componentWillMount() {
document.addEventListener("keydown", this.onKeyPressed.bind(this));
}
componentWillUnmount() {
document.removeEventListener("keydown", this.onKeyPressed.bind(this));
}
onKeyPressed(e) {
console.log(e.keyCode);
}
render() {
let player = this.props.boards.dungeons[this.props.boards.currentBoard].player;
return (
<div
className="player"
style={{ position: "absolute" }}
onKeyDown={this.onKeyPressed} // not working
>
<div className="light-circle">
<div className="image-wrapper">
<img src={IMG_URL+player.img} />
</div>
</div>
</div>
)
}
Ini berfungsi dengan baik, tetapi saya ingin melakukannya lebih banyak dalam gaya React. Saya mencoba
onKeyDown={this.onKeyPressed}
pada komponen. Tapi itu tidak bereaksi. Ia bekerja pada elemen masukan seingat saya.
Bagaimana saya bisa melakukannya?
Jawaban:
Anda harus menggunakan atribut tabIndex agar dapat mendengarkan
onKeyDown
event pada div di React. PengaturantabIndex="0"
harus memecat pawang Anda.sumber
tabIndex={-1}
juga dapat digunakan jika Anda bekerja dengan elemen yang tidak interaktif dan tidak ingin mengubah urutan tab dokumen.Anda perlu menulisnya seperti ini
<div className="player" style={{ position: "absolute" }} onKeyDown={this.onKeyPressed} tabIndex="0" >
Jika
onKeyPressed
tidak terikatthis
, coba tulis ulang menggunakan fungsi panah atau ikat di komponenconstructor
.sumber
console.log
apa-apa?Anda terlalu banyak berpikir dalam Javascript murni. Singkirkan listener Anda pada metode siklus hidup React dan gunakan
event.key
sebagai gantievent.keyCode
(karena ini bukan objek event JS, ini adalah React SyntheticEvent ). Seluruh komponen Anda bisa sesederhana ini (dengan asumsi Anda belum mengikat metode Anda dalam konstruktor).onKeyPressed(e) { console.log(e.key); } render() { let player = this.props.boards.dungeons[this.props.boards.currentBoard].player; return ( <div className="player" style={{ position: "absolute" }} onKeyDown={this.onKeyPressed} > <div className="light-circle"> <div className="image-wrapper"> <img src={IMG_URL+player.img} /> </div> </div> </div> ) }
sumber
event
objek adalah Bereaksi SyntheticEvent .onClick
penyangga alih-alihonKeyDown
api penangan.Jawabannya dengan
<div className="player" onKeyDown={this.onKeyPressed} tabIndex={0} >
berfungsi untuk saya, harap perhatikan bahwa tabIndex memerlukan angka, bukan string, jadi tabIndex = "0" tidak berfungsi.
sumber
Menggunakan
div
trik dengantab_index="0"
atautabIndex="-1"
berfungsi, tetapi setiap kali pengguna memfokuskan tampilan yang bukan elemen, Anda mendapatkan garis besar fokus yang jelek di seluruh situs web. Ini bisa diperbaiki dengan menyetel CSS untuk div yang akan digunakanoutline: none
dalam fokus.Berikut implementasinya dengan komponen bergaya:
import styled from "styled-components" const KeyReceiver = styled.div` &:focus { outline: none; } `
dan di kelas Aplikasi:
render() { return ( <KeyReceiver onKeyDown={this.handleKeyPress} tabIndex={-1}> Display stuff... </KeyReceiver> )
sumber
Anda kehilangan pengikatan metode di konstruktor. Beginilah cara React menyarankan Anda melakukannya:
class Whatever { constructor() { super(); this.onKeyPressed = this.onKeyPressed.bind(this); } onKeyPressed(e) { // your code ... } render() { return (<div onKeyDown={this.onKeyPressed} />); } }
Ada cara lain untuk melakukan ini, tetapi ini akan menjadi yang paling efisien saat runtime.
sumber
Anda harus mencegah peristiwa default memicu.
onKeyPressed(e) { e.preventDefault(); console.log(e.key); }
sumber