La forma de React para establecer qué opción se selecciona para un cuadro de selección, es establecer un value
accesorio especial en <select>
sí mismo, correspondiente al value
atributo en el <option>
elemento que desea seleccionar. Para multiple
seleccionar, este accesorio puede aceptar una matriz en su lugar.
Ahora que este es un atributo especial, me pregunto cuál es la forma canónica de recuperar las opciones seleccionadas en la misma estructura de matriz de valores de opción cuando el usuario cambia las cosas (para que pueda pasarlo a través de una devolución de llamada a un componente principal, etc.), ya que presumiblemente la misma value
propiedad no estará disponible en el elemento DOM.
Para usar un ejemplo, con un campo de texto, haría algo como esto (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} />;
}
});
¿Cuál es el equivalente a reemplazar ???
para este componente de selección múltiple?
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>
);
}
});
fuente
select
s en una matriz? ¿Diga después de agarrarlos a todos víadocument.querySelectorAll('select')
?selectedOptions
no tenía una buena compatibilidad y aún no es compatible con IE. Sin embargo, esta sería la forma moderna de hacerlo.De la misma manera que lo hace en cualquier otro lugar, ya que está trabajando con el nodo DOM real como el objetivo del evento de cambio:
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); }
fuente
(option.value for option in e.target.options when option.selected)
[...e.target.options].filter(({selected}) => selected).map(({value}) => value)
event.target.options
es unHTMLOptionsCollection
, no un Array.HTMLOptionsCollection
no es iterable. Sin embargo,Array.from
todavía funciona con él:Array.from(event.target.options).filter(o => o.selected).map(o => o.value)
La manera más fácil...
handleChange(evt) { this.setState({multiValue: [...evt.target.selectedOptions].map(o => o.value)}); }
fuente
HTMLCollectionOf<HTMLOptionElement>
no es una matriz ...Array.from
Aunque aparentemente funciona. stackoverflow.com/a/49684109/29182En caso de que desee utilizarlo
ref
, puede obtener valores seleccionados como este:var select = React.findDOMNode(this.refs.selectRef); var values = [].filter.call(select.options, function (o) { return o.selected; }).map(function (o) { return o.value; });
Actualización de 2018 ES6
let select = this.refs.selectRef; let values = [].filter.call(select.options, o => o.selected).map(o => o.value);
fuente
selectedOptions
En el caso de que desee realizar un seguimiento de las opciones seleccionadas mientras se completa el formulario:
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
es una colección / lista similar a una matriz de elementos relacionados con el DOM. Obtiene acceso a él en el objeto de destino del evento al seleccionar valores de opción.Array.prototype.slice
ycall
nos permite crear una copia para el nuevo estado. También puede acceder a los valores de esta manera usando una referencia (en caso de que no esté capturando el evento), que era otra respuesta para la pregunta.fuente
selectedOptions
parece bastante incompleta. Pero probablemente sería la solución ideal si hubiera soporte.De hecho, puede encontrar el
selectedOptions
interior del objetivo ... no es necesario repetir todas las opciones. Imaginemos que desea enviar los valores a unaonChange
función pasada a su componente como accesorios: puede usar la siguiente función enonChange
su selección múltiple.onSelectChange = (e) => { const values = [...e.target.selectedOptions].map(opt => opt.value); this.props.onChange(values); };
fuente
selectedOptions
no tenía una buena compatibilidad. Todavía no es compatible con Internet Explorer, por lo que no es realmente utilizable si desea compatibilidad con IE (al menos sin polyfill).Lo siguiente funcionó para mí
var selectBoxObj = React.findDOMNode(this.refs.selectBox) var values = $(selectBoxObj).val()
fuente
Otra forma de hacerlo:
handleChange({ target }) { this.props.someCallback( Array.prototype.slice.call(target.selectedOptions).map(o => o.value) ) }
fuente
Prueba este:
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>
fuente