Estoy probando mi primer fragmento de React.js y me quedé perplejo desde el principio ... Tengo el código a continuación, que genera un formulario de búsqueda en <div id="search"></div>
. Pero escribir en el cuadro de búsqueda no hace nada.
Presumiblemente, algo está faltando al pasar los accesorios y el estado hacia arriba y hacia abajo, y esto parece un problema común. Pero estoy perplejo, no puedo ver lo que falta.
var SearchFacet = React.createClass({
handleChange: function() {
this.props.onUserInput(
this.refs.searchStringInput.value
)
},
render: function() {
return (
<div>
Search for:
<input
type="text"
value={this.props.searchString}
ref="searchStringInput"
onchange={this.handleChange} />
</div>
);
}
});
var SearchTool = React.createClass({
render: function() {
return (
<form>
<SearchFacet
searchString={this.props.searchString}
onUserInput={this.props.onUserInput}
/>
<button>Search</button>
</form>
);
}
});
var Searcher = React.createClass({
getInitialState: function() {
return {
searchString: ''
}
},
handleUserInput: function(searchString) {
this.setState({
searchString: searchString
})
},
render: function() {
return (
<div>
<SearchTool
searchString={this.state.searchString}
onUserInput={this.handleUserInput}
/>
</div>
);
}
});
ReactDOM.render(
<Searcher />,
document.getElementById('searcher')
);
(Eventualmente tendré otros tipos de SearchFacet*
pero solo estoy tratando de que este funcione).
javascript
reactjs
Phil Gyford
fuente
fuente
this
cuando ingrese el campo de texto. Podría ser quethis
ya no sea elSearcher
componente.this
en qué punto del código? Intenta iniciar sesiónSearcher.handleUserInput()
oSearchFacet.handleChange()
no hace nada.Respuestas:
No ha encajado correctamente su
onchange
utilería en elinput
. Debe estaronChange
en JSX.El tema de pasar un
value
accesorio a un<input>
, y luego de alguna manera cambiar el valor pasado en respuesta a la interacción del usuario usando unonChange
controlador está bastante bien considerado en los documentos .Se refieren a entradas como componentes controlados y se refieren a entradas que, en cambio, permiten que el DOM maneje de forma nativa el valor de la entrada y los cambios posteriores del usuario como componentes no controlados .
Siempre que establezca el
value
prop de aninput
en alguna variable, tendrá un componente controlado . Esto significa que debe cambiar el valor de la variable por algún medio programático o, de lo contrario, la entrada siempre mantendrá ese valor y nunca cambiará, incluso cuando escriba: el comportamiento nativo de la entrada, para actualizar su valor al escribir, se anula. por React here.Entonces, está tomando correctamente esa variable del estado y tiene un controlador para actualizar el estado, todo configurado correctamente. El problema fue porque usted tiene
onchange
y no el correcto,onChange
nunca se llamó al controlador y, por lo tanto,value
nunca se actualizó cuando ingresó la entrada. Cuando usa, se llamaonChange
al controlador , se actualiza cuando escribe y ve sus cambios.value
fuente
El uso
value={whatever}
hará que no pueda escribir en el campo de entrada. Deberías usardefaultValue="Hello!"
.Consulte https://facebook.github.io/react/docs/uncontrolled-components.html#default-values
Además,
onchange
debería seronChange
como señala @davnicwil.fuente
value={whatever}
yvalue={this.state.myvalue}
. Debería haber hecho esta aclaración en su lugar: usaronChange={this.handleChange}
y cualquier cosa comohandleChange: function(e) { var newState = {}; newState[e.target.name] = e.target.value; this.setState(newState); },
hace que los campos sean mutables nuevamente.defaultValue
salvar mi día.Esto puede deberse a que la función onChange no actualiza el valor adecuado que se menciona en la entrada.
Ejemplo:
en la función onChange actualice el campo de valor mencionado.
fuente
También tengo el mismo problema y en mi caso inyecté el reductor correctamente pero aún así no pude escribir en el campo. Resulta que si estás usando
immutable
tienes que usarredux-form/immutable
.Tenga en cuenta que su estado debería ser como, de lo
state->form
contrario, debe configurar explícitamente la biblioteca y el nombre del estado debería serform
. ver este problemafuente
Para mí, el siguiente cambio simple funcionó perfectamente
fuente
En un contexto de componente de clase ...
Si el método changeHandler es una función normal:
se puede usar así ...
onChange={(e)=>this.handleChange(e)}
Si el método changeHandler es una función de flecha:
se puede usar así ...
onChange={this.handle}
Y esto resolvió mi problema "No se puede escribir en el campo de entrada de texto de React".
fuente