Je souhaite lire les propriétés de la valeur de l'événement onClick. Mais quand je clique dessus, je vois quelque chose comme ça sur la console:
SyntheticMouseEvent {dispatchConfig: Object, dispatchMarker: ".1.1.0.2.0.0:1", nativeEvent: MouseEvent, type: "click", target
Mon code fonctionne correctement. Quand je cours, je peux voir {column}
mais je ne peux pas l'obtenir dans l'événement onClick.
Mon code:
var HeaderRows = React.createClass({
handleSort: function(value) {
console.log(value);
},
render: function () {
var that = this;
return(
<tr>
{this.props.defaultColumns.map(function (column) {
return (
<th value={column} onClick={that.handleSort} >{column}</th>
);
})}
{this.props.externalColumns.map(function (column) {
// Multi dimension array - 0 is column name
var externalColumnName = column[0];
return ( <th>{externalColumnName}</th>);
})}
</tr>
);
}
});
Comment puis-je transmettre une valeur à l' onClick
événement dans React js?
javascript
reactjs
user1924375
la source
la source
Réponses:
Moyen facile
Utilisez une fonction de flèche:
Cela créera une nouvelle fonction qui appelle
handleSort
avec les bons paramètres.Meilleure façon
Extrayez-le dans un sous-composant. Le problème avec l'utilisation d'une fonction fléchée dans l'appel de rendu est qu'il créera une nouvelle fonction à chaque fois, ce qui finira par provoquer des restitutions inutiles.
Si vous créez un sous-composant, vous pouvez passer le gestionnaire et utiliser les accessoires comme arguments, qui ne seront ensuite restitués que lorsque les accessoires changent (car la référence du gestionnaire ne change plus):
Sous-composant
Composant principal
Old Easy Way (ES5)
Utilisez
.bind
pour passer le paramètre souhaité:la source
<a>
balise où vous devez passer l'événement, afin d'utiliserpreventDefault()
bind
.Il y a de bonnes réponses ici, et je suis d'accord avec @Austin Greco (la deuxième option avec des composants séparés)
Il y a une autre façon que j'aime, le curry .
Ce que vous pouvez faire est de créer une fonction qui accepte un paramètre (votre paramètre) et renvoie une autre fonction qui accepte un autre paramètre (l'événement click dans ce cas). alors vous êtes libre d'en faire ce que vous voulez.
ES5:
ES6:
Et vous l'utiliserez de cette façon:
Voici un exemple complet d'une telle utilisation:
Afficher l'extrait de code
Notez que cette approche ne résout pas la création d'une nouvelle instance sur chaque rendu.
J'aime cette approche par rapport aux autres gestionnaires en ligne car celle-ci est plus concise et lisible à mon avis.
Modifier:
Comme suggéré dans les commentaires ci-dessous, vous pouvez mettre en cache / mémoriser le résultat de la fonction.
Voici une implémentation naïve:
Afficher l'extrait de code
la source
handleChange = param => cache[param] || (e => { // the function body })
De nos jours, avec ES6, je pense que nous pourrions utiliser une réponse mise à jour.
Fondamentalement, (pour ceux qui ne le savent pas) car
onClick
attend une fonction qui lui est transmise,bind
fonctionne car il crée une copie d'une fonction. Au lieu de cela, nous pouvons passer une expression de fonction de flèche qui appelle simplement la fonction que nous voulons et conservethis
. Vous ne devriez jamais avoir besoin de lier larender
méthode dans React, mais si pour une raison quelconque vous perdezthis
dans l'une de vos méthodes de composant:la source
render()
car il est appelé par React. Si quoi que ce soit, vous avez besoinbind
des gestionnaires d'événements, et uniquement lorsque vous n'utilisez pas de flèches.props
àsuper()
outhis.props
ne sera pas défini pendant le constructeur, ce qui peut prêter à confusion.foo = () => {...}
et y faire référence pour rendre<button onClick={this.foo}...
la seule raison d'inclure une fonction de flèche si vous utilisez babel de cette manière, IMO, est si vous voulez capturer une variable qui n'existe que dans la portée de la méthode render () (les événements peuvent simplement être transmis et ne s'appliquent pas).[[h / t à @ E.Sundin pour avoir lié ceci dans un commentaire]
La première réponse (fonctions anonymes ou liaison) fonctionnera, mais ce n'est pas la plus performante, car elle crée une copie du gestionnaire d'événements pour chaque instance générée par la
map()
fonction.Ceci est une explication de la façon optimale de le faire à partir du plugin ESLint-react :
la source
this.state
, vous pouvez l'échanger en toute sécurité avec un SFC.Ceci est mon approche, je ne sais pas à quel point c'est mauvais, veuillez commenter
Dans l'élément cliquable
et alors
la source
encodeURIComponent(JSON.stringify(myObj))
, puis de l' analyser,JSON.parse(decodeURIComponent(myObj))
. Pour les fonctions, je suis presque sûr que cela ne fonctionnera pas sans eval ou new Function (), qui devraient être évités. Pour ces raisons, je n'utilise pas d'attributs de données pour transmettre des données dans React / JS.cet exemple peut être légèrement différent du vôtre. mais je peux vous assurer que c'est la meilleure solution que vous pouvez avoir pour ce problème. j'ai cherché pendant des jours une solution qui n'a aucun problème de performance. et a finalement trouvé celui-ci.
MISE À JOUR
dans le cas où vous souhaitez traiter des objets qui sont censés être les paramètres. vous pouvez l'utiliser
JSON.stringify(object)
pour le convertir en chaîne et l'ajouter à l'ensemble de données.la source
la source
Une autre option n'impliquant pas
.bind
ou ES6 consiste à utiliser un composant enfant avec un gestionnaire pour appeler le gestionnaire parent avec les accessoires nécessaires. Voici un exemple (et un lien vers un exemple de travail est ci-dessous):L'idée de base est que le composant parent transmette la
onClick
fonction à un composant enfant. Le composant enfant appelle laonClick
fonction et peut accéder à tous ceux qui lui sontprops
transmis (et àevent
), ce qui vous permet d'utiliser n'importe quelleevent
valeur ou d'autres accessoires dans laonClick
fonction du parent .Voici une démonstration de CodePen montrant cette méthode en action.
la source
Faire une autre tentative pour répondre à la question de OP, y compris les appels e.preventDefault ():
Lien rendu ( ES6 )
Fonction des composants
la source
Je me rends compte que c'est assez tard pour la fête, mais je pense qu'une solution beaucoup plus simple pourrait satisfaire de nombreux cas d'utilisation:
Je suppose que vous pouvez également utiliser un
data-
attribut.Simple, sémantique.
la source
Créez simplement une fonction comme celle-ci
et appelez-le à l'endroit dont vous avez besoin
<Icon onClick = {() => {methodName (theParamsYouwantToPass); }} />
la source
Vous pouvez simplement le faire si vous utilisez
ES6
.la source
L'implémentation affiche le nombre total à partir d'un objet en transmettant le nombre en tant que paramètre du composant principal aux composants secondaires, comme décrit ci-dessous.
Voici MainComponent.js
Et voici
SubComp.js
Essayez d'implémenter ci-dessus et vous obtiendrez un scénario exact indiquant comment les paramètres de passage fonctionnent dans reactjs sur n'importe quelle méthode DOM.
la source
J'ai écrit un composant wrapper qui peut être réutilisé à cet effet qui s'appuie sur les réponses acceptées ici. Si tout ce que vous devez faire est de passer une chaîne, ajoutez simplement un attribut de données et lisez-le depuis e.target.dataset (comme certains l'ont suggéré). Par défaut, mon wrapper se liera à tout accessoire qui est une fonction et commence par «on» et retransmet automatiquement l'accessoire de données à l'appelant après tous les autres arguments d'événement. Bien que je ne l'ai pas testé pour les performances, cela vous donnera l'occasion d'éviter de créer la classe vous-même, et il peut être utilisé comme ceci:
ou pour Composants et fonctions
ou si vous préférez
déclarer qu'en dehors de votre conteneur (près de vos importations)
Voici l'utilisation dans un conteneur:
Voici le code wrapper 'withData.js:
la source
J'ai ci-dessous 3 suggestions à ce sujet sur JSX onClick Events -
En fait, nous n'avons pas besoin d'utiliser la fonction .bind () ou Arrow dans notre code. Vous pouvez une utilisation simple dans votre code.
Vous pouvez également déplacer l'événement onClick de th (ou ul) à tr (ou li) pour améliorer les performances. Fondamentalement, vous aurez n nombre d '"écouteurs d'événements" pour votre élément n li.
// Et vous pouvez accéder
item.id
à laonItemClick
méthode comme indiqué ci-dessous:Je suis d'accord avec l'approche mentionnée ci-dessus pour créer un composant React séparé pour ListItem et List. Ce code de rendu semble bon, mais si vous en avez 1000, alors 1000 écouteurs d'événements seront créés. Veuillez vous assurer que vous ne devriez pas avoir beaucoup d'auditeur d'événements.
la source
J'ai ajouté du code pour passer la valeur de l'événement onclick à la méthode de deux manières. 1 . en utilisant la méthode bind 2. en utilisant la méthode arrow (=>). voir les méthodes handlesort1 et handlesort
la source
Voici l'exemple qui transmet la valeur à l'événement onClick.
J'ai utilisé la syntaxe es6. rappelez-vous que la fonction de flèche du composant de classe ne se lie pas automatiquement, donc la liaison explicitement dans le constructeur.
la source
Je suppose que vous devrez lier la méthode à l'instance de classe React. Il est plus sûr d'utiliser un constructeur pour lier toutes les méthodes dans React. Dans votre cas, lorsque vous passez le paramètre à la méthode, le premier paramètre est utilisé pour lier le contexte «this» de la méthode, vous ne pouvez donc pas accéder à la valeur à l'intérieur de la méthode.
la source
la source
C'est un moyen très simple.
la source
la source
Sortir de nulle part à cette question, mais je pense
.bind
que ça fera l'affaire. Trouvez l'exemple de code ci-dessous.la source
Utilisation de la fonction flèche:
Vous devez installer l'étape 2:
npm install babel-preset-stage-2:
la source
Il y a 3 façons de gérer cela: -
Liez la méthode dans le constructeur comme: -
Utilisez la fonction flèche lors de sa création comme: -
La troisième façon est la suivante: -
la source
Vous pouvez utiliser votre code comme ceci:
Ici, c'est pour un objet d'événement, si vous souhaitez utiliser des méthodes d'événement comme
preventDefault()
dans votre fonction de poignée ou si vous voulez obtenir une valeur cible ou un nom commee.target.name
.la source
J'ai trouvé la solution de passer param comme attribut d'un tag tout à fait raisonnable.
Cependant, il a ses limites:
C'est pourquoi j'ai créé cette bibliothèque: react-event-param
Il:
Exemple d'utilisation:
la source
Il y avait beaucoup de considérations de performances, toutes dans le vide.
Le problème avec ces gestionnaires est que vous devez les curry afin d'incorporer l'argument que vous ne pouvez pas nommer dans les accessoires.
Cela signifie que le composant a besoin d'un gestionnaire pour chaque élément cliquable. Convenons que pour quelques boutons ce n'est pas un problème, non?
Le problème se pose lorsque vous manipulez des données tabulaires avec des dizaines de colonnes et des milliers de lignes. Là, vous remarquez l'impact de la création d'autant de gestionnaires.
Le fait est que je n'en ai besoin que d'un.
J'ai défini le gestionnaire au niveau de la table (ou UL ou OL ...), et lorsque le clic se produit, je peux dire quelle était la cellule cliquée en utilisant les données disponibles depuis toujours dans l'objet événement:
J'utilise les champs de variable pour vérifier que le clic s'est produit dans un élément valide, par exemple ignorer les clics dans les pieds de page des TH.
Le rowIndex et le cellIndex donnent l'emplacement exact de la cellule cliquée.
Le contenu du texte est le texte de la cellule cliquée.
De cette façon, je n'ai pas besoin de transmettre les données de la cellule au gestionnaire, il peut le self-service.
Si j'avais besoin de plus de données, de données qui ne doivent pas être affichées, je peux utiliser l'attribut d'ensemble de données ou des éléments cachés.
Avec une navigation DOM simple, tout est à portée de main.
Cela a été utilisé en HTML depuis toujours, car les PC étaient beaucoup plus faciles à embourber.
la source
Il existe deux façons de passer des paramètres dans les gestionnaires d'événements, certains suivent.
Vous pouvez utiliser une fonction de flèche pour encapsuler un gestionnaire d'événements et transmettre des paramètres:
l'exemple ci-dessus équivaut à appeler
.bind
ou vous pouvez explicitement appeler bind.En dehors de ces deux approches, vous pouvez également passer des arguments à une fonction définie comme une fonction curry.
la source
Utilisez une fermeture , il en résulte une solution propre:
<th onClick={this.handleSort(column)} >{column}</th>
La fonction handleSort renverra une fonction dont la colonne de valeur est déjà définie.
La fonction anonyme sera appelée avec la valeur correcte lorsque l'utilisateur cliquera sur le th.
Exemple: https://stackblitz.com/edit/react-pass-parameters-example
la source
Un changement simple est requis:
Utilisation
<th value={column} onClick={that.handleSort} >{column}</th>
au lieu de
<th value={column} onClick={that.handleSort} >{column}</th>
la source