2017-09-15 4 views
2

Comment déclencher un événement lorsqu'une option est sélectionnée dans une liste déroulante dans ReactJS. Actuellement j'utilise onChange mais je dois déclencher un événement même si la même option est sélectionnée à nouveau.ReactJS - événement déclencheur même si la même option est sélectionnée dans la liste déroulante sélectionnée

Code actuel:

<select name="select1" onChange={this.onChangeOption}> 
    <option value='A'>Please select A...</option> 
    <option value='B'>Please select B...</option> 
    <option value='C'>Please select C...</option> 
    <option value='D'>Please select D...</option> 
</select> 

J'ai même essayé d'ajouter à l'option gestionnaire onClick mais ne se déclenche pas, cliquez sur les options qu'il fonctionne uniquement avec les éléments.

Je sais qu'il existe des solutions utilisant jquery en liant un événement click avec un élément option, mais qui nécessitent une solution dans React. Ne voulez pas inclure jQuery pour cette seule exigence.

+0

si vous voulez réagir et angulaire combinés pour réagir s'il vous plaît enlever l'étiquette angulaire/en cours d'utilisation angulaire de marque de '' ngModel' et de l'utilisation (ngModelChanges) ' –

+0

https: // stackoverflow. com/questions/22482842/the-onclick-event-does-not-work-for-options Je ne pense pas qu'il existe un moyen d'obtenir un événement si l'option sélectionnée est cliquée. Voir aussi https://stackoverflow.com/questions/16513638/how-to-receive-an-event-when-selected-option-is-the-already-selected-option-of-a –

+0

@ GünterZöchbauer Merci l'homme. Je sais qu'il existe des solutions utilisant jquery, mais il faut une solution dans React. Ne voulez pas inclure jQuery pour cette seule exigence. –

Répondre

6

C'est truc, mais si vous avez besoin de fonctionner feu avec les tous les changements, même avec le changement de la même option, une seule solution que je sais - utiliser onClick et ses détails:

class Select extends React.Component{ 
    onChangeOption(e){ 
     if (e.detail === 0){ 
      console.log(e.target.value); 
     } 
    } 
    render(){ 
     return (
      <select name="select1" onClick={this.onChangeOption}> 
       <option value='A'>Please select A...</option> 
       <option value='B'>Please select B...</option> 
       <option value='C'>Please select C...</option> 
       <option value='D'>Please select D...</option> 
      </select> 
     ) 
    } 
} 

https://jsfiddle.net/69z2wepo/86140/

+0

qu'est-ce que e.detail === 0 symbolise? –

+2

detail est utilisé pour transmettre des données d'événement supplémentaires. Sur un clic normal/souris, le nombre de clics est envoyé (2 sur dbclick). Lorsque vous sélectionnez une option dans 'select',' e.detail' est toujours 0 car il n'y a pas de données supplémentaires à envoyer comme dans le cas des événements souris habituels (vous ne pouvez pas dbcliquer une 'option') – AVAVT

+0

@AVAVT, merci:) – Andrew

0

Vous pouvez le faire en utilisant l'événement onClick fourni par ReactJS

<select 
    name="select1" 
    onChange={(e) => { 
    // Do not use onChange method, for your use case 
    console.log('event value', e.target.value); 
    console.log('event name', e.target.name); 
    }} 
    onClick={(e) => { 
    // Use onClick method, for your use case 
    console.log('XX event value', e.target.value); 
    console.log('XX event name', e.target.name); 
    }} 
> 
    <option value='A'>Please select A...</option> 
    <option value='B'>Please select B...</option> 
    <option value='C'>Please select C...</option> 
    <option value='D'>Please select D...</option> 
</select> 

onChange comme son nom l'indique ne sera déclenché lorsque la valeur précédente de select ne correspond pas à la nouvelle valeur qui lui est fournie. Mais dans votre cas puisque vous voulez déclencher l'événement de changement même si la même valeur est sélectionnée. Vous devez utiliser la méthode onClick comme je l'ai démontré dans le code ci-dessus. Cela se déclenchera chaque fois que vous cliquerez sur select tag.

J'espère que cela aide. Vive

+0

Désolé, mais cela a un défaut .. Dès que vous cliquez sur sélectionner une liste déroulante, onClick sera viré. Et lors de la sélection d'une option, cet événement de clic est à nouveau déclenché. De plus, lorsque vous modifiez l'option 2, les événements sont déclenchés ensemble, cliquez et modifiez. –

+0

Vous pouvez supprimer la méthode onChange, le code ci-dessus était une démonstration. Vous devez utiliser onChange ou onClick. Surtout nous devrions utiliser onChange mais dans votre cas, vous devriez utiliser onClick. –

+0

Mais cela ne va pas aider aussi bien puisque dès que vous cliquez sur sélectionner une liste déroulante, onClick sera viré. Et lors de la sélection d'une option, cet événement de clic est à nouveau déclenché. –

0

Espérons que cela va résoudre votre problème, car nous n'avons rien bydefault en javascript. Juste un travail autour. Il est préférable de ne pas faire ce calcul avec le callback à chaque fois que l'onclick est déclenché.

let a = 0; //temporary variable - not requred until its particular 
 
let onChangeOption =()=>{ 
 
a = a+1; //not requred until its particular 
 
if(a%2 == 0){// not requred until its particular 
 
console.log("triggered ") 
 
} 
 
}
<select name="select1" onclick="onChangeOption()"> 
 
    <option value='A'>Please select A...</option> 
 
    <option value='B'>Please select B...</option> 
 
    <option value='C'>Please select C...</option> 
 
    <option value='D'>Please select D...</option> 
 
</select>