reactjs에서 Esc 키 누르기를 어떻게 감지합니까? jquery와 비슷한 것
$(document).keyup(function(e) {
if (e.keyCode == 27) { // escape key maps to keycode `27`
// <DO YOUR WORK HERE>
}
});
일단 감지되면 구성 요소에 정보를 전달하고 싶습니다. 마지막 활성 구성 요소가 이스케이프 키 누름에 반응해야하는 세 가지 구성 요소가 있습니다.
구성 요소가 활성화되면 일종의 등록을 생각했습니다.
class Layout extends React.Component {
onActive(escFunction){
this.escFunction = escFunction;
}
onEscPress(){
if(_.isFunction(this.escFunction)){
this.escFunction()
}
}
render(){
return (
<div class="root">
<ActionPanel onActive={this.onActive.bind(this)}/>
<DataPanel onActive={this.onActive.bind(this)}/>
<ResultPanel onActive={this.onActive.bind(this)}/>
</div>
)
}
}
그리고 모든 구성 요소에
class ActionPanel extends React.Component {
escFunction(){
//Do whatever when esc is pressed
}
onActive(){
this.props.onActive(this.escFunction.bind(this));
}
render(){
return (
<input onKeyDown={this.onActive.bind(this)}/>
)
}
}
나는 이것이 효과가 있다고 믿지만 콜백과 더 비슷할 것이라고 생각합니다. 이것을 처리하는 더 좋은 방법이 있습니까?
답변
문서 수준의 키 이벤트 처리를 찾고 있다면 그 동안 바인딩하는 componentDidMount
것이 가장 좋은 방법입니다 ( Brad Colthurst의 코드 펜 예제에서 볼 수 있음 ).
class ActionPanel extends React.Component {
constructor(props){
super(props);
this.escFunction = this.escFunction.bind(this);
}
escFunction(event){
if(event.keyCode === 27) {
//Do whatever when esc is pressed
}
}
componentDidMount(){
document.addEventListener("keydown", this.escFunction, false);
}
componentWillUnmount(){
document.removeEventListener("keydown", this.escFunction, false);
}
render(){
return (
<input/>
)
}
}
잠재적 인 오류 및 메모리 누수를 방지하려면 마운트 해제시 키 이벤트 리스너를 제거해야합니다.
편집 : 후크를 사용하는 경우이 useEffect
구조를 사용하여 유사한 효과를 생성 할 수 있습니다 .
const ActionPanel = (props) => {
const escFunction = useCallback((event) => {
if(event.keyCode === 27) {
//Do whatever when esc is pressed
}
}, []);
useEffect(() => {
document.addEventListener("keydown", escFunction, false);
return () => {
document.removeEventListener("keydown", escFunction, false);
};
}, []);
return (
<input />
)
};
답변
ReactkeyCode
에서 escape (27) 를 듣고 싶을 것입니다 .SyntheticKeyBoardEvent
onKeyDown
const EscapeListen = React.createClass({
handleKeyDown: function(e) {
if (e.keyCode === 27) {
console.log('You pressed the escape key!')
}
},
render: function() {
return (
<input type='text'
onKeyDown={this.handleKeyDown} />
)
}
})
질문의 댓글에 게시 된 Brad Colthurst의 CodePen 은 다른 키의 키 코드를 찾는 데 도움이됩니다.
답변
기능적 구성 요소에서이를 수행하는 또 다른 방법은 다음 useEffect
과 useFunction
같이 and 를 사용하는 것입니다.
import React, { useEffect } from 'react';
const App = () => {
useEffect(() => {
const handleEsc = (event) => {
if (event.keyCode === 27) {
console.log('Close')
}
};
window.addEventListener('keydown', handleEsc);
return () => {
window.removeEventListener('keydown', handleEsc);
};
}, []);
return(<p>Press ESC to console log "Close"</p>);
}
console.log 대신 useState
무언가를 트리거 하는 데 사용할 수 있습니다 .
답변
용도는 반응 SyntheticKeyboardEvent 기본 브라우저 이벤트를 래핑이 합성 이벤트가 제공 키 속성의 이름 ,
당신은 다음과 같이 사용할 수 있습니다 :
handleOnKeyDown = (e) => {
if (['Enter', 'ArrowRight', 'Tab'].includes(e.key)) {
// select item
e.preventDefault();
} else if (e.key === 'ArrowUp') {
// go to top item
e.preventDefault();
} else if (e.key === 'ArrowDown') {
// go to bottom item
e.preventDefault();
} else if (e.key === 'Escape') {
// escape
e.preventDefault();
}
};
답변
재사용 가능한 React 후크 솔루션
import React, { useEffect } from 'react';
const useEscape = (onEscape) => {
useEffect(() => {
const handleEsc = (event) => {
if (event.keyCode === 27)
onEscape();
};
window.addEventListener('keydown', handleEsc);
return () => {
window.removeEventListener('keydown', handleEsc);
};
}, []);
}
export default useEscape
용법:
const [isOpen, setIsOpen] = useState(false);
useEscape(() => setIsOpen(false))