Vous rencontrez des difficultés pour faire fonctionner ce code. Vous voulez simplement gérer chaque cas de bouton différemment en utilisant une fonction au lieu de 3 fonctions distinctes. Certaines réponses très anciennes de stackoverflow recommandaient d'utiliser un commutateur, mais je n'arrive pas à le faire fonctionner. Je n'obtiens aucune erreur avec le code ci-dessous, mais appuyer sur les boutons n'imprime rien à la console.
myFunction = button => { var x = button.id; switch (x) { case 'All Saves': console.log('All Saves'); break; case 'Threads': console.log('Threads'); break; case 'Comments': console.log('Comments'); break; default: return false; } } render () { return ( <div className="container"> <div className="btn-group"> <button type="button" onClick={this.myFunction.bind(this)} id="All Saves">All Saves</button> <button type="button" onClick={this.myFunction.bind(this)} id="Threads">Threads</button> <button type="button" onClick={this.myFunction.bind(this)} id="Comments">Comments</button> </div> </div> ) }
3 Réponses :
Vous avez oublié d'accéder à la propriété target
de l'événement:
myFunction = button => { var x = button.target.id; switch (x) { case 'All Saves': console.log('All Saves'); break; case 'Threads': console.log('Threads'); break; case 'Comments': console.log('Comments'); break; default: return false; } }
Renommer bouton
en événement
aurait également du sens.
C'est la convention.
Ou en utilisant ceci
au lieu du bouton
.
@VLAZ - Cela ne fonctionnera pas. Regardez ce que fait bind
. Notez que bind
est utilisé.
@Quentin ah, putain. J'ai oublié ça. Vous avez raison - le bind
l'empêchera.
appelez la fonction avec l'événement de clic:
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script> <div id="root"></div>
class App extends React.Component { myFunction = event => { var x = event.target.id; switch (x) { case 'All Saves': console.log('All Saves'); break; case 'Threads': console.log('Threads'); break; case 'Comments': console.log('Comments'); break; default: return false; } } render() { return ( <div className="container"> <div className="btn-group"> <button type="button" onClick={e => this.myFunction(e)} id="All Saves">All Saves</button> <button type="button" onClick={e => this.myFunction(e)} id="Threads">Threads</button> <button type="button" onClick={e => this.myFunction(e)} id="Comments">Comments</button> </div> </div> ); } } ReactDOM.render(<App />, document.getElementById("root"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script> <div id="root"></div>
class MyButtons extends React.Component { myFunction = event => { var x = event.target.id; switch (x) { case 'All Saves': console.log('All Saves'); break; case 'Threads': console.log('Threads'); break; case 'Comments': console.log('Comments'); break; default: return false; } } render() { return ( <div className="container"> <div className="btn-group"> <button type="button" onClick={e => this.myFunction(e)} id="All Saves">All Saves</button> <button type="button" onClick={e => this.myFunction(e)} id="Threads">Threads</button> <button type="button" onClick={e => this.myFunction(e)} id="Comments">Comments</button> </div> </div> ); } } ReactDOM.render(<MyButtons />, document.getElementById("root"));
Voici l'exemple de travail pour votre problème
Vous avez défini
maFonction
comme une variable, alors que vous définissez le gestionnaire de clics comme étantthis.myFunction
. Il n'y aura pas toujours la même chose.Votre fonction est-elle appelée?
Que se passe-t-il lorsque vous
console.log (x);
? Ouconsole.log (bouton)
?@VLAZ Je ne suis pas sûr de vous avoir compris.
@SimonThiel Je m'attends à ce qu'il soit appelé au clic. Je ne l'appelle pas en dehors de ça.