react handlesubmit form example event javascript reactjs

javascript - handlesubmit - React.js: identificación de diferentes entradas con un controlador onChange



react select onchange (9)

Curioso cuál es la forma correcta de abordar esto es:

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 separadas de cambio de mango para manejar cada entrada diferente, pero eso no es muy agradable. Del mismo modo, podría crear un componente solo para una entrada individual, pero quería ver si hay una manera de hacerlo así.


Solución obsoleta

valueLink/checkedLink están en deprecated del núcleo de 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 propio componente de Input

Contenido de respuesta anterior:

Lo que desea lograr se puede lograr mucho más fácilmente utilizando los ayudantes de enlace de datos bidireccionales de React.

var Hello = React.createClass({ mixins: [React.addons.LinkedStateMixin], getInitialState: function() { return {input1: 0, input2: 0}; }, render: function() { var total = this.state.input1 + this.state.input2; return ( <div>{total}<br/> <input type="text" valueLink={this.linkState(''input1'')} />; <input type="text" valueLink={this.linkState(''input2'')} />; </div> ); } }); React.renderComponent(<Hello />, document.getElementById(''content''));

Fácil, ¿verdad?

http://facebook.github.io/react/docs/two-way-binding-helpers.html

Incluso puedes implementar tu propio mixin


@Vigril Disgr4ce

Cuando se trata de formularios de campo múltiple, tiene sentido usar la característica clave de React: componentes.

En mis proyectos, creo componentes TextField, que toman un valor prop como mínimo, y se ocupa de manejar comportamientos comunes de un campo de texto de entrada. De esta manera, no tiene que preocuparse por mantener un registro de los nombres de los campos al actualizar el estado del valor.

[...] handleChange: function(event) { this.setState({value: event.target.value}); }, render: function() { var value = this.state.value; return <input type="text" value={value} onChange={this.handleChange} />; } [...]


El evento onChange burbujea ... Entonces puedes hacer algo como esto:

// A sample form render () { <form onChange={setField}> <input name="input1" /> <input name="input2" /> </form> }

Y su método setField podría verse así (suponiendo que esté utilizando ES2015 o posterior:

setField (e) { this.setState({[e.target.name]: e.target.value}) }

Utilizo algo similar a esto en varias aplicaciones, y es bastante útil.


Hola, he mejorado la respuesta ssorallen . No es necesario enlazar la función porque puede acceder a la entrada sin ella.

var Hello = React.createClass({ render: function() { var total = this.state.input1 + this.state.input2; return ( <div>{total}<br/> <input type="text" value={this.state.input1} id="input1" onChange={this.handleChange} /> <input type="text" value={this.state.input2} id="input2" onChange={this.handleChange} /> </div> ); }, handleChange: function (name, value) { var change = {}; change[name] = value; this.setState(change); } }); React.renderComponent(<Hello />, document.getElementById(''content''));


Puede rastrear el valor de cada input niño creando un componente de InputField separado que gestiona el valor de una sola input . Por ejemplo, InputField podría ser:

var InputField = React.createClass({ getInitialState: function () { return({text: this.props.text}) }, onChangeHandler: function (event) { this.setState({text: event.target.value}) }, render: function () { return (<input onChange={this.onChangeHandler} value={this.state.text} />) } })

Ahora el valor de cada input se puede rastrear dentro de una instancia separada de este componente InputField sin crear valores separados en el estado del padre para monitorear cada componente secundario.


Puede usar el método .bind para .bind los parámetros en el método handleChange . Sería algo así como:

var Hello = React.createClass({ getInitialState: function() { return {input1:0, input2:0}; }, render: function() { var total = this.state.input1 + this.state.input2; return ( <div>{total}<br/> <input type="text" value={this.state.input1} onChange={this.handleChange.bind(this, ''input1'')} /> <input type="text" value={this.state.input2} onChange={this.handleChange.bind(this, ''input2'')} /> </div> ); }, handleChange: function (name, e) { var change = {}; change[name] = e.target.value; this.setState(change); } }); React.renderComponent(<Hello />, document.getElementById(''content''));

(También hice que el total se compute en el momento del renderizado, ya que es lo que se recomienda hacer).


Puede usar un atributo de React especial llamado ref y luego hacer coincidir los nodos DOM reales en el evento onChange usando la función getDOMNode() React :

handleClick: function(event) { if (event.target === this.refs.prev.getDOMNode()) { ... } } render: function() { ... <button ref="prev" onClick={this.handleClick}>Previous question</button> <button ref="next" onClick={this.handleClick}>Next question</button> ... }


Sugiero apegarse a los atributos HTML estándar, como el name en input elementos de input para identificar sus entradas. Además, no necesita mantener "total" como un valor separado en estado porque es composable agregando otros valores en su estado:

var Hello = React.createClass({ getInitialState: function() { return {input1: 0, input2: 0}; }, render: function() { const total = this.state.input1 + this.state.input2; return ( <div>{total}<br/> <input type="text" value={this.state.input1} name="input1" onChange={this.handleChange} /> <input type="text" value={this.state.input2} name="input2" onChange={this.handleChange} /> </div> ); }, handleChange: function(e) { this.setState({[e.target.name]: e.target.value}); } }); React.renderComponent(<Hello />, document.getElementById(''content''));


También puedes hacerlo así:

... constructor() { super(); this.state = { input1: 0, input2: 0 }; this.handleChange = this.handleChange.bind(this); } handleChange(input, value) { this.setState({ input: value }) } render() { const total = this.state.input1 + this.state.input2; return ( <div> {total}<br /> <input type="text" onChange={e => this.handleChange(''input1'', e.target.value)} /> <input type="text" onChange={e => this.handleChange(''input2'', e.target.value)} /> </div> ) }