Dans un composant React pour un <select>
menu, je dois définir l' selected
attribut sur l'option qui reflète l'état de l'application.
Dans render()
, le optionState
est transmis du propriétaire de l'État au composant SortMenu. Les valeurs des options sont transmises à partir props
de JSON.
render: function() {
var options = [],
optionState = this.props.optionState;
this.props.options.forEach(function(option) {
var selected = (optionState === option.value) ? ' selected' : '';
options.push(
<option value={option.value}{selected}>{option.label}</option>
);
});
// pass {options} to the select menu jsx
Cependant, cela déclenche une erreur de syntaxe lors de la compilation JSX.
Cela supprime l'erreur de syntaxe mais ne résout évidemment pas le problème:
var selected = (optionState === option.value) ? 'selected' : 'false';
<option value={option.value} selected={selected}>{option.label}</option>
J'ai également essayé ceci:
var selected = (optionState === option.value) ? true : false;
<option value={option.value} {selected ? 'selected' : ''}>{option.label}</option>
Existe-t-il un moyen recommandé de résoudre ce problème?
javascript
reactjs
cantera
la source
la source
Réponses:
React comprend automatiquement les booléens à cet effet, vous pouvez donc simplement écrire (remarque: non recommandé)
et il sortira «sélectionné» de manière appropriée.
Cependant, React vous facilite la tâche. Au lieu de définir
selected
sur chaque option, vous pouvez (et devriez) simplement écrirevalue={optionsState}
sur la balise select elle - même :Pour plus d'informations, consultez le document React select tag .
la source
onChange={this.handleSelect}
et définir la valeur d'état pour votre composant, par exemple: 'handleSelect: function () {this.setState ({value: event.target.value});} `Cela rendrait votre composant sélectionné avec de nouveaux Élément sélectionné. J'espère que cela vous aidera.value
accessoire sur un<select>
peut être un tableau si vous l'avezmultiselect
activé.defaultValue
pour initialiserVous pouvez faire ce que React vous avertit lorsque vous essayez de définir la propriété "sélectionnée" de
<option>
:Ainsi, vous pouvez utiliser
options.value
surdefaultValue
votre choixla source
Voici une solution complète qui incorpore la meilleure réponse et les commentaires ci-dessous (qui pourraient aider quelqu'un qui a du mal à tout reconstituer):
MISE À JOUR POUR ES6 (2019) - Utilisation des fonctions fléchées et de la déstructuration d'objets
dans le composant principal:
composant inclus (qui est maintenant une fonction sans état):
RÉPONSE PRÉCÉDENTE (à l'aide de bind):
dans le composant principal:
composant inclus (qui est maintenant une fonction sans état):
le composant principal conserve la valeur sélectionnée pour les fruits (en état), le composant inclus affiche l'élément sélectionné et les mises à jour sont retransmises au composant principal pour mettre à jour son état (qui revient ensuite au composant inclus pour modifier la valeur sélectionnée).
Notez l'utilisation d'un accessoire de nom qui vous permet de déclarer une seule méthode handleChange pour les autres champs du même formulaire, quel que soit leur type.
la source
this.handleChange.bind(this);
doit êtrethis.handleChange = this.handleChange.bind(this)
;Voici le dernier exemple de la façon de procéder. À partir de React Docs , plus la syntaxe de la méthode de liaison automatique "Fat-Arrow".
la source
Ajoutez simplement la première option de votre balise de sélection:
Cela deviendra par défaut et lorsque vous sélectionnerez une option valide sera réglée sur votre état
la source
la source
J'ai rencontré un problème avec les
<select>
balises qui ne se mettent pas à jour correctement<option>
lorsque l'état change. Mon problème semblait être que si vous effectuez deux rendus successifs rapidement, la première fois sans présélection<option>
mais la deuxième fois avec un, le<select>
balise ne se met pas à jour sur le deuxième rendu, mais reste sur la valeur par défaut en premier.J'ai trouvé une solution à cela en utilisant des références . Vous devez obtenir une référence à votre
<select>
nœud de balise (qui peut être imbriqué dans certains composants), puis mettre à jour manuellement lavalue
propriété sur celui-ci, dans lecomponentDidUpdate
crochet.la source
Publier une réponse similaire pour MULTISELECT / optgroups:
la source
J'ai une solution simple en suivant le HTML de base.
.text-hide
est une classe bootstrap, si vous n'utilisez pas bootstrap, vous êtes ici:la source
J'ai résolu un problème similaire en définissant defaultProps:
<select value="this.props.propName" ...
Alors maintenant j'évite les erreurs de compilation si mon accessoire n'existe pas avant le montage.
la source
value
accessoire à un champ de formulaire sansonChange
gestionnaire. Cela rendra un champ en lecture seule. Si le champ doit être modifiable, utilisezdefaultValue
. Sinon, définissez soitonChange
oureadOnly
.