Le moyen de réaction pour définir l’option sélectionnée pour une zone de sélection consiste à définir un attribut value
spécial sur le <select>
lui-même, correspondant à l’attribut value
de l’élément <option>
que vous souhaitez sélectionner. Pour un multiple
, sélectionnez cet attribut peut accepter un tableau à la place. ( Edit : Actuellement, la documentation semble avoir supprimé la référence à cela)
Maintenant qu’il s’agit d’un attribut spécial, je me demande quelle est la manière la plus efficace de récupérer les options sélectionnées dans la même structure de tableau-de-options-valeurs lorsque via un rappel vers un composant parent, etc.), étant donné que la même propriété value
ne sera probablement pas disponible sur l’élément DOM.
Pour utiliser un exemple, avec un champ de texte, vous feriez quelque chose comme ceci (JSX):
var TextComponent = React.createClass({
handleChange: function(e) {
var newText = e.target.value;
this.props.someCallbackFromParent(newText);
},
render: function() {
return <input type="text" value={this.props.someText} onChange={this.handleChange} />;
}
});
Quel est l'équivalent de remplacer ???
pour ce composant à sélection multiple?
var MultiSelectComponent = React.createClass({
handleChange: function(e) {
var newArrayOfSelectedOptionValues = ???;
this.props.someCallbackFromParent(newArrayOfSelectedOptionValues);
},
render: function() {
return (
<select multiple={true} value={this.props.arrayOfOptionValues} onChange={this.handleChange}>
<option value={1}>First option</option>
<option value={2}>Second option</option>
<option value={3}>Third option</option>
</select>
);
}
});
De la même manière que vous le faites n'importe où ailleurs, puisque vous travaillez avec le nœud DOM réel comme cible de l'événement change:
handleChange: function(e) {
var options = e.target.options;
var value = [];
for (var i = 0, l = options.length; i < l; i++) {
if (options[i].selected) {
value.Push(options[i].value);
}
}
this.props.someCallback(value);
}
Si vous voulez utiliser ref
, vous pouvez obtenir les valeurs sélectionnées comme ceci:
var select = React.findDOMNode(this.refs.selectRef);
var values = [].filter.call(select.options, function (o) {
return o.selected;
}).map(function (o) {
return o.value;
});
2018 ES6 mise à jour
let select = this.refs.selectRef;
let values = [].filter.call(select.options, o => o.selected).map(o => o.value);
Si vous souhaitez suivre les options sélectionnées pendant le traitement du formulaire:
handleChange(e) {
// assuming you initialized the default state to hold selected values
this.setState({
selected:[].slice.call(e.target.selectedOptions).map(o => {
return o.value;
});
});
}
selectedOptions
est une collection/liste d'éléments liés au DOM. Vous y avez accès dans l'objet cible d'événement lors de la sélection des valeurs d'option. Array.prototype.slice
et call
nous permet de créer une copie de celui-ci pour le nouvel état. Vous pouvez également accéder aux valeurs de cette manière en utilisant un ref (au cas où vous ne capturez pas l'événement), ce qui était une autre réponse à la question.
Le moyen le plus simple ...
handleChange(evt) {
this.setState({multiValue: [...evt.target.selectedOptions].map(o => o.value)});
}
Ce qui suit a fonctionné pour moi
var selectBoxObj = React.findDOMNode(this.refs.selectBox)
var values = $(selectBoxObj).val()
Avec Array.from()
et e.target.selectedOptions
, vous pouvez effectuer une sélection multiple contrôlée:
handleChange = (e) => {
let value = Array.from(e.target.selectedOptions, option => option.value);
this.setState({values: value});
}
target.selectedOptions retourne une collection HTMLC
Une autre façon de le faire:
handleChange({ target }) {
this.props.someCallback(
Array.prototype.slice.call(target.selectedOptions).map(o => o.value)
)
}
Vous pouvez réellement trouver la selectedOptions
dans la cible ... inutile de parcourir toutes les options. Imaginons que vous souhaitiez envoyer les valeurs à une fonction onChange
passée à votre composant sous forme d'accessoires: vous pouvez utiliser la fonction suivante sur la onChange
de votre sélection multiple.
onSelectChange = (e) => {
const values = [...e.target.selectedOptions].map(opt => opt.value);
this.props.onChange(values);
};
Essaye celui-là:
dropdownChanged = (event) => {
let obj = JSON.parse(event.target.value);
this.setState(
{
key: obj.key,
selectedName: obj.name,
type: obj.type
});
}
<select onChange={this.dropdownChanged} >
<option value={JSON.stringify({ name: 'name', key: 'key', type: "ALL" })} >All Projetcs and Spaces</option></select>