簡體   English   中英

如何檢測 React 中的 Esc 鍵按下以及如何處理

[英]How to detect Esc Key Press in React and how to handle it

如何檢測 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示例所示 ):

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 />
  )
};

對於可重用的 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

您將需要從React SyntheticKeyBoardEvent onKeyDown監聽轉義的keyCode (27):

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有助於查找其他按鍵的按鍵代碼。

React使用SyntheticKeyboardEvent包裝本地瀏覽器事件,並且此Synthetic事件提供了命名的key屬性
您可以這樣使用:

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();
  }
};

在功能組件中完成此操作的另一種方法是使用useEffectuseFunction ,如下所示:

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>);
}

您可以使用useState來觸發某些操作,而不是console.log。

function handleEsc(event) {
    if (event.keyCode === 27) {
      close();
    }
  }

  useEffect(() => {
    window.addEventListener("keydown", handleEsc);
    return () => {
      window.removeEventListener("keydown", handleEsc);
    };
  }, []);

如果您想直接在您的組件中而不是鈎子中使其工作,或者如果您像我一樣在不返回 <Component 的鈎子中使用它,這對我有用。

useEffect(()=>{
    document.addEventListener('keydown', (e) => {
      e.key === 'Escape' && setOpenState(false)
    })
    return () => {
      document.removeEventListener('keydown', (e) => e)
    }
  },[openState])

反應鈎子

const [add, setAdd] = useState(false);
useEffect(()=>{
        document.addEventListener("keydown", keydownFunction, false);
        return  () => { document.removeEventListener("keydown", keydownFunction, false); };
    }, []);
const keydownFunction =(event)=>{
        if (event.key === "Escape") {  setAdd(false); }
        if (event.key === "+") { setAdd(true); }) }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM