En este video veremos como crear un formulario utilizando React.js, como asociar cada uno de los campos a las variables de estado y establecer su valor con el evento onChange, que nos permitirá validar la información capturada en los campos del formulario.
Al crear un formulario con la etiqueta <form> la acción del formulario se establece con el evento onSubmit, el cual invocará una función que se encargará de realizar la validación de los campos y realizar las acciones correspondientes al objetivo del formulario:
<form onSubmit={this.onsubmit} >
</form>
En el ejemplo anterior, el formulario invoca la función o método onsubmit. Si ahora consideramos un sólo campo:
<form onSubmit={this.onsumbit}>
<input type="text" name="nombre" value={this.state.nombre} onChange={this.handleChange} />
<input type="submit" name="submit" value="Enviar" />
</form>
Como se observa en el ejemplo anterior, el campo es un input de tipo text cuyo nombre o name es nombre. Lo importante en los formularios con React es utilizar los atributos value y el evento onChange.
El atributo value está asignado a una variable de estado con el nombre: nombre y el evento onChange a una función o método que hemos llamado handleChange. Este método o función deberá actualizar la variable de estado cada vez que el usuario escribe un caracter o pulsa una tecla en el teclado. Es decir, cada vez que ocurre esta acción se invocará el metodo handleChange y este deberá enviar el dato capturado en el campo a la variable de estado.
handleChange(event) {
//Obtenemos el valor capturado en el campo y lo guardamos en una variable valor
const valor = event.target.value;
//Mandamos el valor a la variable de estado llamada nombre
this.setState({nombre: valor});
}
En la implementación anterior, del método handleChange, obtenermos el valor capturado en el campo y lo mandamos a la variable de estado, la cual está asignada al atributo value del campo en el formulario. Por lo tanto el valor capturado se guarda en la variable de estado y se muestra en el campo.
Cuando el usuario oprima el botón Enviar, se invocará la función onsumbit:
onsubmit(event){
event.stopPropagation();
event.preventDefault();
//El valor capturado lo obtenemos de la variable de estado
const datos = this.state.nombre;
// En la variable datos guardamos el valor capturado en el campo del formulario
}
Cada uno de los campos se asocia a una variable de estado utilizando el atributo value del campo o input y además se agrega el evento onChange asociándolo a una función en la clase.
Este es el código generado en el tutorial:
import React, {Component} from 'react'; | |
import {Row, Col, Form, Input, Label, FormGroup, Button, FormFeedback} from 'reactstrap'; | |
class App extends Component { | |
constructor(props){ | |
super(props); | |
this.state = { | |
nombre: '', | |
correo: '', | |
edad: '', | |
mensajeNombre: '', | |
mensajeCorreo: '', | |
mensajeEdad: '', | |
invalidNombre: false, | |
invalidCorreo: false, | |
invalidEdad: false, | |
} | |
this.onChange = this.onChange.bind(this); | |
this.enviarAlaBD = this.enviarAlaBD.bind(this); | |
} | |
onChange = e =>{ | |
const {name, value} = e.target; | |
this.setState({ | |
[name]: value, | |
}); | |
} | |
enviarAlaBD = e => { | |
e.preventDefault(); | |
let valido = true; | |
if(this.state.nombre === ''){ | |
this.setState({ | |
invalidNombre: true, | |
mensajeNombre: 'El campo nombre es obligatorio, indica tu nombre', | |
}); | |
valido = false; | |
} | |
if(this.state.correo === ''){ | |
this.setState({ | |
invalidCorreo: true, | |
mensajeCorreo: 'Indica tu dirección de correo', | |
}); | |
valido = false; | |
} | |
if(this.state.edad === ''){ | |
this.setState({ | |
invalidEdad: true, | |
mensajeEdad: 'Indica tu edad', | |
}); | |
valido = false; | |
} | |
if(valido){ | |
//Enviarlo a la base de datos o a otro componente | |
console.log("Se envian los datos " + JSON.stringify(this.state)); | |
} | |
} | |
render(){ | |
return ( | |
<div> | |
<Row> | |
<Col xs="3"></Col> | |
<Col xs="6"> | |
<h2>Registro de Participantes</h2> | |
<Form onSubmit={this.enviarAlaBD}> | |
<FormGroup> | |
<Label>Nombre</Label> | |
<Input type="text" name="nombre" value={this.state.nombre} onChange={this.onChange} invalid={this.state.invalidNombre} /> | |
<FormFeedback>{this.state.mensajeNombre}</FormFeedback> | |
</FormGroup> | |
<FormGroup> | |
<Label>Correo</Label> | |
<Input type="email" name="correo" value={this.state.correo} onChange={this.onChange} invalid={this.state.invalidCorreo}/> | |
<FormFeedback>{this.state.mensajeCorreo}</FormFeedback> | |
</FormGroup> | |
<FormGroup> | |
<Label>Edad</Label> | |
<Input type="text" name="edad" className="col-2" value={this.state.edad} onChange={this.onChange} invalid={this.state.invalidEdad} /> | |
<FormFeedback>{this.state.mensajeEdad}</FormFeedback> | |
</FormGroup> | |
<FormGroup> | |
<Button color="success">Guardar</Button> | |
</FormGroup> | |
</Form> | |
</Col> | |
</Row> | |
</div> | |
); | |
} | |
} | |
export default App; |
Repositorio completo en GitHub
https://github.com/JacobAvila/formularios_en_react.git