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

前端 未结 5 919
梦如初夏
梦如初夏 2021-01-30 00:02

How do I detect Esc keypress on reactjs? The similar thing to jquery

$(document).keyup(function(e) {
     if (e.keyCode == 27) { // escape key maps to keycode `         


        
相关标签:
5条回答
  • 2021-01-30 00:13

    If you're looking for a document-level key event handling, then binding it during componentDidMount is the best way (as shown by Brad Colthurst's codepen example):

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

    Note that you should make sure to remove the key event listener on unmount to prevent potential errors and memory leaks.

    EDIT: If you are using hooks, you can use this useEffect structure to produce a similar effect:

    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 />
      )
    };
    
    0 讨论(0)
  • 2021-01-30 00:16

    Another way to accomplish this in a functional component, is to use useEffect and useFunction, like this:

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

    Instead of console.log, you can use useState to trigger something.

    0 讨论(0)
  • 2021-01-30 00:25

    For a reusable React hook solution

    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
    

    Usage:

    const [isOpen, setIsOpen] = useState(false);
    useEscape(() => setIsOpen(false))
    
    0 讨论(0)
  • 2021-01-30 00:28

    React uses SyntheticKeyboardEvent to wrap native browser event and this Synthetic event provides named key attribute,
    which you can use like this:

    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();
      }
    };
    
    0 讨论(0)
  • 2021-01-30 00:29

    You'll want to listen for escape's keyCode (27) from the React 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's CodePen posted in the question's comments is helpful for finding key codes for other keys.

    0 讨论(0)
提交回复
热议问题