En un componente Reaccionar para un <select>
menú, necesito establecer el selected
atributo en la opción que refleja el estado de la aplicación.
En render()
, optionState
se pasa del propietario del estado al componente SortMenu. Los valores de las opciones se pasan props
desde 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
Sin embargo, eso desencadena un error de sintaxis en la compilación JSX.
Hacer esto elimina el error de sintaxis pero obviamente no resuelve el problema:
var selected = (optionState === option.value) ? 'selected' : 'false';
<option value={option.value} selected={selected}>{option.label}</option>
También probé esto:
var selected = (optionState === option.value) ? true : false;
<option value={option.value} {selected ? 'selected' : ''}>{option.label}</option>
¿Hay alguna forma recomendada de resolver esto?
javascript
reactjs
cantera
fuente
fuente
Respuestas:
React entiende automáticamente los booleanos para este propósito, por lo que simplemente puede escribir (nota: no recomendado)
y saldrá 'seleccionado' adecuadamente.
Sin embargo, React lo hace aún más fácil para usted. En lugar de definir
selected
en cada opción, puede (y debería) simplemente escribirvalue={optionsState}
en la propia etiqueta de selección :Para obtener más información, consulte el documento React select tag doc .
fuente
onChange={this.handleSelect}
y establecer el valor de estado para su componente, por ejemplo: 'handleSelect: function () {this.setState ({value: event.target.value});} `Esto devolvería su componente seleccionado con nuevo item seleccionado. Espero que te ayude.value
accesorio en un<select>
puede ser una matriz si lo hamultiselect
habilitado.defaultValue
para inicializarPuede hacer lo que React le advierte cuando intenta establecer la propiedad "seleccionada" de
<option>
:Por lo tanto, puede usar
options.value
eldefaultValue
de su selecciónfuente
Aquí hay una solución completa que incorpora la mejor respuesta y los comentarios a continuación (lo que podría ayudar a alguien que lucha por reconstruirlo todo):
ACTUALIZACIÓN PARA ES6 (2019): uso de funciones de flecha y desestructuración de objetos
en componente principal:
componente incluido (que ahora es funcional sin estado):
RESPUESTA PREVIA (usando bind):
en componente principal:
componente incluido (que ahora es funcional sin estado):
el componente principal mantiene el valor seleccionado para la fruta (en estado), el componente incluido muestra el elemento seleccionado y las actualizaciones se devuelven al componente principal para actualizar su estado (que luego vuelve al componente incluido para cambiar el valor seleccionado).
Tenga en cuenta el uso de un nombre prop que le permite declarar un solo método handleChange para otros campos en el mismo formulario, independientemente de su tipo.
fuente
this.handleChange.bind(this);
debe serthis.handleChange = this.handleChange.bind(this)
;Aquí está el último ejemplo de cómo hacerlo. De los documentos de reacción , más la sintaxis del método de "flecha gruesa" de enlace automático
fuente
Simplemente agregue como primera opción de su etiqueta de selección:
Esto se convertirá en predeterminado y cuando seleccione una opción válida se establecerá en su estado
fuente
fuente
He tenido un problema con las
<select>
etiquetas que no se actualizan correctamente<option>
cuando cambia el estado. Mi problema parecía ser que si renderizaba dos veces seguidas, la primera vez sin preselección<option>
pero la segunda vez con una, la<select>
etiqueta no se actualiza en la segunda representación, sino que permanece en la predeterminada primero.Encontré una solución para esto usando referencias . Debe obtener una referencia a su
<select>
nodo de etiqueta (que podría estar anidado en algún componente) y luego actualizar manualmente lavalue
propiedad en él, en elcomponentDidUpdate
gancho.fuente
Publicando una respuesta similar para MULTISELECT / optgroups:
fuente
Tengo una solución simple es seguir el HTML básico.
.text-hide
es una clase de bootstrap, si no usa bootstrap, aquí está:fuente
Resolví un problema similar estableciendo defaultProps:
<select value="this.props.propName" ...
Así que ahora evito errores en la compilación si mi accesorio no existe hasta el montaje.
fuente
value
accesorio a un campo de formulario sin unonChange
controlador. Esto generará un campo de solo lectura. Si el campo debe ser mutable, usedefaultValue
. De lo contrario, establezcaonChange
oreadOnly
.