如何在 reactjs 上检测 Esc 按键?与jquery类似的东西
$(document).keyup(function(e) { if (e.keyCode == 27) { // escape key maps to keycode `27` // <DO YOUR WORK HERE> } });
一旦检测到,我想将信息传递给组件。我有 3 个组件,其中最后一个活动组件需要对转义键做出反应。
我正在考虑一种在组件变为活动时进行注册
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 的 codepen 示例所示):
componentDidMount
class ActionPanel extends React.Component { constructor(props){ super(props); this.escFunction = this.escFunction.bind(this); } escFunction(event){ if (event.key === "Escape") { //Do whatever when esc is pressed } } componentDidMount(){ document.addEventListener("keydown", this.escFunction, false); } componentWillUnmount(){ document.removeEventListener("keydown", this.escFunction, false); } render(){ return ( <input/> ) } }
请注意,您应该确保在卸载时删除关键事件侦听器,以防止潜在的错误和内存泄漏。
编辑:如果你使用钩子,你可以使用这个useEffect结构来产生类似的效果:
useEffect
const ActionPanel = (props) => { const escFunction = useCallback((event) => { if (event.key === "Escape") { //Do whatever when esc is pressed } }, []); useEffect(() => { document.addEventListener("keydown", escFunction, false); return () => { document.removeEventListener("keydown", escFunction, false); }; }, []); return ( <input /> ) };
编辑 React 17:React 改变了处理文档级事件绑定的方式,如果在链中的某个点event.stopPropogation()被调用,这可能会导致此实现停止工作。true您可以通过将侦听器的最后一个参数更改为而不是来确保首先调用此函数false。如果您这样做并且还调用event.stopPropogation(),则以前调用的其他处理程序将不再发生,因此我建议尽可能避免该调用。
event.stopPropogation()
true
false