react中如何监听全局键盘事件,并在组件销毁时,解除监听事件

3,586 阅读2分钟

react中如何监听全局键盘事件,并在组件销毁时,解除监听事件

由于我们需要监听的是全局的键盘事件,不能对某个特定的dom元素绑定键盘事件,我们只能在全局监听键盘事件:​​document.addEventListener("keyup", fun, false)​​。

键盘事件有:​​keydown​​keyup​​ 、​keypress​

简单讲一下键盘事件有哪些:

keydown : 键盘被按下,如果一直按着键盘的按键,则keydown事件会一直被触发。

keyup : 释放某个键盘键时触发。该事件仅在松开键盘时触发一次,不是一个持续的响应状态

keypress :按下某个键盘键并释放时触发。如果按住某个键,会不断触发该事件。该事件处理函数返回 false 时,会取消默认的动作(如输入的键盘字符)

描述一下我遇到的场景:进入一个弹窗页面,按下Esc按钮可以退出,<— 和 —>可以切换内容。

正如我上面所讲的,我只能在全局中绑定一个监听事件,并在组件销毁时,解除监听事件。那我们必须会用到useEffect,一进来时绑定,然后销毁时return掉。

代码如下:

useEffect(() =>{
    //监听键盘事件
    document.addEventListener("keyup", PopupKeyUp, false)
    return ()=>{
         //销毁键盘事件
      document.removeEventListener("keyup", PopupKeyUp, false)
    }
  })

//键盘事件函数
  const PopupKeyUp = (e)=>{
    if (e.code === "Escape") {
      onclose()
    }
    if (e.code === "ArrowLeft") {
      LeftSwitchFile()
    }
    if (e.code === "ArrowRight") {
      RightSwitchFile()
    }
  }

附:

键盘事件定义的属性

属性说明
keyCode该属性包含键盘中对应键位的键值
charCode该属性包含键盘中对应键位的 Unicode 编码,仅 DOM 支持
target发生事件的节点(包含元素),仅 DOM 支持
srcElement发生事件的元素,仅 IE 支持
shiftKey是否按下 Shift 键,如果按下返回 true,否则为false
ctrlKey是否按下 Ctrl 键,如果按下返回 true,否则为false
altKey是否按下 Alt 键,如果按下返回 true,否则为false
metaKey是否按下 Mtea 键,如果按下返回 true,否则为false,仅 DOM 支持

如果你使用的组合键,例如:ctrl+c

document.onkeyup=function(e){
  //按下ctrl+c
  if(e.ctrlKey && e.keyCode ===67 ){
      
  }
}