Curioso sobre cuál es la forma correcta de abordar esto:
var Hello = React.createClass({
getInitialState: function() {
return {total: 0, input1:0, input2:0};
},
render: function() {
return (
<div>{this.state.total}<br/>
<input type="text" value={this.state.input1} onChange={this.handleChange} />
<input type="text" value={this.state.input2} onChange={this.handleChange} />
</div>
);
},
handleChange: function(e){
this.setState({ ??? : e.target.value});
t = this.state.input1 + this.state.input2;
this.setState({total: t});
}
});
React.renderComponent(<Hello />, document.getElementById('content'));
Obviamente, podría crear funciones de handleChange separadas para manejar cada entrada diferente, pero eso no es muy bueno. Del mismo modo, podría crear un componente solo para una entrada individual, pero quería ver si hay una manera de hacerlo así.
javascript
reactjs
jsx
T3db0t
fuente
fuente
this.setState({ [e.target.name]: e.target.value });
Puede usar el
.bind
método para precompilar los parámetros delhandleChange
método. Sería algo así como:(También hice que
total
se calcule en el momento del renderizado, ya que es lo más recomendable).fuente
this.handleChange.bind(...)
crea una nueva función. En caso de que esté usandoshouldComponentUpdate
conPureRenderMixin
o algo similar se romperá. Todos sus componentes de entrada se volverán a procesar cuando cambie un solo valor.handleChange
ahandleChange(name) { return event => this.setState({name: event.target.value}); }
, puede pasar la "misma" función (no creará una nueva función como se hace usando.bind()
Entonces, puede pasar dicha función:this.handleChange("input1")
this.setState(change, function () { console.log(this.state.input1); );
referencia: stackoverflow.com/questions/30782948/…El
onChange
evento burbujea ... Entonces puedes hacer algo como esto:Y su método setField podría verse así (suponiendo que esté usando ES2015 o posterior:
Utilizo algo similar a esto en varias aplicaciones, y es bastante útil.
fuente
Solución obsoleta
valueLink/checkedLink
están en desuso del núcleo React, porque confunde a algunos usuarios. Esta respuesta no funcionará si usa una versión reciente de React. Pero si te gusta, puedes emularlo fácilmente creando tu propioInput
componenteViejo contenido de respuesta:
Lo que desea lograr puede lograrse mucho más fácilmente con los ayudantes de enlace de datos bidireccionales de React.
Fácil verdad?
http://facebook.github.io/react/docs/two-way-binding-helpers.html
Incluso puedes implementar tu propio mixin
fuente
También puedes hacerlo así:
fuente
[]
alrededorinput
en setState. Eso hace que la propiedad sea asignada dinámicamentePuede usar un
React
atributo especial llamadoref
y luego hacer coincidir los nodos DOM reales en elonChange
evento utilizandoReact
lagetDOMNode()
función de:fuente
prev
es solo un nombre que configuré en elrender()
métodoevent.target === this.refs.prev
. facebook.github.io/react/blog/2015/10/07/…@Vigril Disgr4ce
Cuando se trata de formas de campo múltiple, tiene sentido usar la característica clave de React: componentes.
En mis proyectos, creo componentes TextField, que toman un valor de apoyo como mínimo, y se encarga de manejar los comportamientos comunes de un campo de texto de entrada. De esta forma, no tiene que preocuparse por realizar un seguimiento de los nombres de campo al actualizar el estado del valor.
fuente
Puede realizar un seguimiento del valor de cada hijo
input
creando unInputField
componente separado que gestione el valor de un soloinput
. Por ejemplo, elInputField
podría ser:Ahora
input
se puede rastrear el valor de cada uno dentro de una instancia separada de esteInputField
componente sin crear valores separados en el estado primario para monitorear cada componente secundario.fuente
Proporcionaré una solución realmente simple al problema. Supongamos que tenemos dos entradas
username
ypassword
, pero queremos que nuestro identificador sea fácil y genérico, para poder reutilizarlo y no escribir código repetitivo.I. Nuestra forma:
II.Nuestro constructor, del que queremos guardar nuestro
username
ypassword
, para que podamos acceder a ellos fácilmente:III. El manejo interesante y "genérico" con un solo
onChange
evento se basa en esto:Dejame explicar:
1.Cuando se detecta un cambio,
onChange(event)
se llama2. Luego obtenemos el parámetro de nombre del campo y su valor:
let inputName = event.target.name; ex: username
let value = event.target.value; ex: itsgosho
3. De acuerdo con el parámetro de nombre, obtenemos nuestro valor del estado en el constructor y lo actualizamos con el valor:
this.state['username'] = 'itsgosho'
4.La clave a tener en cuenta aquí es que el nombre del campo debe coincidir con nuestro parámetro en el estado
Espero haber ayudado a alguien de alguna manera :)
fuente
La clave de su estado debe ser la misma que el nombre de su campo de entrada. Entonces puede hacer esto en el método handleEvent;
fuente
Hola, he mejorado la respuesta ssorallen . No necesita vincular la función porque puede acceder a la entrada sin ella.
fuente