158 votes

React onClick - passer l'événement avec un paramètre

Sans paramètre

function clickMe(e){
  //e is the event
}

<button onClick={this.clickMe}></button>

Avec paramètre

function clickMe(parameter){
  //how to get the "e" ?
}
<button onClick={() => this.clickMe(someparameter)}></button>

Je veux obtenir le event . Comment puis-je l'obtenir ?

271voto

Jyothi Babu Araja Points 5271

Essayez ça :

<button 
   onClick={(e) => {
      this.clickMe(e, someParameter);
   }}
>
Click Me!
</button>

Et dans votre fonction :

function clickMe(event, someParameter){
     //do with event
}

3 votes

Cela m'avait donné une erreur eslint ( eslint.org/docs/rules/flèches-parents.html ) Ce que j'ai fait, c'est mettre les paramètres de la fonction entre parenthèses. onClick={(e) => { this.clickMe(e, someparameter) }}

1 votes

Oui @kretzm Si nous ne donnons pas d'accolades, cela agit comme une expression de retour lorsqu'il s'agit d'une ligne unique, sinon nous devons utiliser des accolades pour envelopper comme un corps de fonction.

6 votes

Je veux juste ajouter que c'est une syntaxe non recommandée. Extrait de la documentation de reactjs : Le problème avec cette syntaxe est qu'une callback différente est créée à chaque fois que le bouton est rendu. Dans la plupart des cas, cela ne pose pas de problème. Toutefois, si cette fonction de rappel est transmise en tant que propriété à des composants inférieurs, ces derniers peuvent effectuer un nouveau rendu supplémentaire. Pour éviter ce genre de problème de performance, nous vous recommandons généralement de lier le bouton dans le constructeur ou d'utiliser la syntaxe des champs de classe. Plus d'informations sur reactjs.org

62voto

Minh Kha Points 736

Avec l'ES6, vous pouvez faire de manière plus courte comme ceci :

const clickMe = (parameter) => (event) => {
    // Do something
}

Et utilisez-la :

<button onClick={clickMe(someParameter)} />

1 votes

Est-ce que cela résout également le problème de la création d'un nouveau callback ? stackoverflow.com/questions/42597602/

1 votes

En plus de cela, vous pouvez envoyer plusieurs paramètres. const clickMe = (parameter1,parameter2) => (event) => { // Faire quelque chose }

3 votes

Celui-ci est également déclenché lorsque votre composant est monté, votre code devrait l'être : onClick={(e) => clickMe(someParameter)(e)}

22voto

Bence Dergez Points 41

Solution 1

function clickMe(parameter, event){
}

<button onClick={(event) => {this.clickMe(someparameter, event)}></button>

Solution 2 L'utilisation de la fonction bind est considérée comme meilleure que celle de la fonction arrow, dans la solution 1. Notez que le paramètre de l'événement doit être le dernier paramètre de la fonction du gestionnaire.

function clickMe(parameter, event){
}

<button onClick={this.clickMe.bind(this, someParameter)}></button>

1 votes

Pourriez-vous fournir une explication sur la solution 2 ?

14voto

Alexander Kim Points 4879

Currying avec un exemple ES6 :

const clickHandler = param => event => {
  console.log(param); // your parameter
  console.log(event.type); // event type, e.g.: click, etc.
};

Notre bouton, qui fait basculer le gestionnaire :

<button onClick={(e) => clickHandler(1)(e)}>Click me!</button>

Si vous voulez appeler cette expression de fonction sans objet d'événement, vous l'appelez de cette façon :

clickHandler(1)();

De plus, étant donné que react utilise des événements synthétiques (une enveloppe pour les événements natifs), il y a une fonction regroupement d'événements ce qui signifie que, si vous voulez utiliser votre event de manière asynchrone, vous devrez alors utiliser la fonction event.persist() :

const clickHandler = param => event => {
  event.persist();
  console.log(event.target);
  setTimeout(() => console.log(event.target), 1000); // won't be null, otherwise if you haven't used event.persist() it would be null.
};

Voici un exemple concret : https://codesandbox.io/s/compassionate-joliot-4eblc?fontsize=14&hidenavigation=1&theme=dark

0 votes

Pourquoi ai-je encore besoin d'avoir event.persist() con console.log(event) mais je n'en ai pas besoin avec console.log(event.target) ?

1 votes

0 votes

Dans ce contexte, il est plus rapide d'utiliser une fonction normale recevant 2 paramètres que de faire du currying. Vous pouvez effectuer un test de référence dans jsben.ch

8voto

Harry Chang Points 349

Pour résoudre complètement le problème de la création d'une nouvelle callback, utilisez la fonction data-* en HTML5 est la meilleure solution, selon moi. Car en fin de compte, même si vous extrayez un sous-composant pour passer les paramètres, cela crée toujours de nouvelles fonctions.

Par exemple,

const handleBtnClick = e => {
  const { id } = JSON.parse(e.target.dataset.onclickparam);
  // ...
};

<button onClick={handleBtnClick} data-onclickparam={JSON.stringify({ id: 0 })}>

Voir https://developer.mozilla.org/en-US/docs/Learn/HTML/Howto/Use_data_attributes pour avoir utilisé data-* attributs.

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