175 votes

Comment détecter la pression de la touche Echap dans React et comment la gérer ?

Comment détecter une pression sur la touche Esc dans reactjs ? La chose similaire à jquery

$(document).keyup(function(e) {
     if (e.keyCode == 27) { // escape key maps to keycode `27`
        // <DO YOUR WORK HERE>
    }
});

Une fois détecté, je veux transmettre l'information aux composants. J'ai 3 composants dont le dernier composant actif doit réagir à la pression de la touche Echap.

Je pensais à une sorte d'enregistrement de l'activation d'un composant.

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

et sur tous les composants

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

Je crois que cela fonctionnera mais je pense que ce sera plutôt un rappel. Y a-t-il une meilleure façon de gérer cela ?

0 votes

N'avez-vous pas une implémentation de flux pour stocker le composant actif au lieu de le faire de cette façon ?

0 votes

@BenHare : Je suis encore assez novice en la matière. J'étudie la possibilité de migrer vers React. Je n'ai pas essayé flux, donc vous suggérez que je devrais regarder dans flux pour la solution. PS : Que diriez-vous de détecter une pression sur la touche ESC ?

5 votes

Pour clarifier, cherchez-vous à détecter les pressions sur les touches au niveau du document, comme le premier bloc de code ? Ou est-ce pour un champ de saisie ? Vous pouvez faire l'un ou l'autre, mais je ne suis pas sûr de savoir comment formuler une réponse. Voici un exemple rapide au niveau du document : codepen.io/anon/pen/ZOzaPW

2voto

skosari Points 45

Si vous voulez que cela fonctionne directement dans votre composant au lieu d'un crochet, ou si comme moi vous l'utilisez dans un crochet qui NE renvoie PAS un <Composant>, cela a fonctionné pour moi.

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

2voto

Ahmed Elsayed Points 45
function handleEsc(event) {
    if (event.keyCode === 27) {
      close();
    }
  }

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

0 votes

Pouvez-vous expliquer un peu votre code ? Bien que cela puisse aider le demandeur, pour que la question soit utile à d'autres à l'avenir, veuillez ajouter quelques explications sur ce que fait le code.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X