Johann Enrique Hurtado Salas
Miguel Sosa
Armando Martínez
La gestión de eventos en React es una habilidad fundamental para crear aplicaciones interactivas y dinámicas. A través de los eventos, podemos capturar las acciones del usuario como clics, entradas de texto o movimientos del ratón, y responder a ellas de manera eficiente. React simplifica este proceso con su sistema de eventos sintéticos, permitiéndonos crear interfaces de usuario altamente responsivas con un código limpio y mantenible.
¿Qué son los eventos sintéticos en React?
Los eventos en React funcionan de manera similar a los eventos nativos de HTML, pero con algunas diferencias importantes. React implementa un sistema de eventos sintéticos que actúan como una capa de abstracción sobre los eventos nativos del navegador.
Una diferencia notable es la sintaxis: mientras que en HTML utilizamos nombres de eventos en minúsculas como onclick, en React empleamos camelCase, escribiendo onClick. Esta convención de nomenclatura es característica de React y se aplica a todos los eventos que manejamos.
Otra diferencia fundamental es que en React no pasamos strings a los manejadores de eventos, sino funciones. Esto nos permite ejecutar código más complejo y manipular el estado de nuestros componentes cuando ocurre un evento.
// HTML tradicional <button onclick="handleClick()">Clic aquí</button> // React <button onClick={handleClick}>Clic aquí</button>
¿Cómo crear un formulario interactivo con eventos?
Vamos a crear un componente que capture la entrada de texto de un usuario y muestre un saludo personalizado en tiempo real. Este ejemplo ilustra perfectamente cómo los eventos y el estado trabajan juntos en React.
Creando el componente NameForm
Primero, necesitamos importar el hook useState para manejar el estado del componente:
import React, { useState } from 'react'; const NameForm = () => { const [name, setName] = useState(''); return ( <div> <input type="text" placeholder="Ingresa tu nombre" value={name} onChange={(event) => setName(event.target.value)} /> <p>Hola, {name ? name : 'visitante'}</p> </div> ); }; export default NameForm;
En este componente:
name inicializado como un string vacíoonChange para detectar cuando el usuario escribe en el inputname con el valor actual del inputMejorando la experiencia de usuario
Para mejorar la experiencia, podemos agregar un título y estructurar mejor nuestro componente:
const NameForm = () => { const [name, setName] = useState(''); return ( <div> <h1>Formulario de nombre</h1> <input type="text" placeholder="Ingresa tu nombre" value={name} onChange={(event) => setName(event.target.value)} /> <p>Hola, {name ? name : 'visitante'}</p> </div> ); };
Este patrón de diseño es muy común en React: capturar eventos del usuario, actualizar el estado y reflejar esos cambios en la interfaz de manera inmediata.
¿Qué otros eventos podemos manejar en React?
React soporta una amplia variedad de eventos que podemos utilizar para crear interfaces interactivas:
onClick, onMouseOver, onMouseOutonChange, onSubmit, onFocus, onBluronKeyDown, onKeyPress, onKeyUponCopy, onCut, onPasteTodos estos eventos siguen la misma sintaxis con camelCase y reciben funciones como manejadores.
Ejemplo de un evento onClick
En clases anteriores vimos cómo implementar un botón toggle utilizando el evento onClick:
const ToggleButton = () => { const [isOn, setIsOn] = useState(false); return ( <button onClick={() => setIsOn(!isOn)}> {isOn ? 'ON' : 'OFF'} </button> ); };
Este componente cambia entre los estados "ON" y "OFF" cada vez que el usuario hace clic en el botón, demostrando cómo podemos usar eventos para crear componentes interactivos.
Los eventos en React nos permiten crear aplicaciones verdaderamente interactivas, respondiendo a las acciones del usuario de manera eficiente y predecible. La combinación de eventos sintéticos y el sistema de estado de React proporciona una forma poderosa de construir interfaces de usuario dinámicas con un código limpio y mantenible. ¿Has implementado tu propio formulario siguiendo estos conceptos? Comparte tu experiencia en los comentarios y muestra cómo quedó tu implementación.
Johann Enrique Hurtado Salas
Miguel Sosa
Armando Martínez
Jhonny Pimiento
Aloy Foxy
Cristian Javier Martinez Torres
Raúl Adolfo Sánchez Rodríguez
Sebastian Pérez
Yan Harold Muñoz Dominguez
Ramger Deivi Duran
Juan Diego Mejia Maestre
JAVIER VELASQUEZ
David Bautista
David Bautista
Rafael Hernández Silva
Johan Sebastian
Denis Gomez
Juan Carlos Avella Gutierrez
Joan Alexander Valerio Rodríguez
David Castro
Daniel Alberto Vega Bejarano
Daniel Alberto Vega Bejarano
Daniel Hidalgo
yo decidi almacenar el funcionamiento del onchage en una funcion estatica antes del render de la informacion para darle el uso en el onChange de una forma mas practica y asi se viera el render mas compacto 😁
import { useState } from "react"; const NameForm = () => { const [name, setName] = useState('') const changeName = () => (e) => setName(e.target.value); return( <> <h2>Formulario de nombre</h2> <input type="text" placeholder="Ingresa tu nombre" value={name} onChange={changeName()} /> <p>Hola {name || 'Visitante'}</p> </> ) } export default NameForm;
Muy buena solución, ya que tener los handlers fuera son más mantenibles. En tu caso de ejemplo haría algunos cambios, por ejemplo:
const changeName = () => (e) => setName(e.target.value); // con const changeName = (e) => setName(e.target.value); // y <input ... onChange={changeName()} ... /> // con <input ... onChange={changeName} ... /> ```Los cambios lo que hacen es que la función original no retorna otra función ya que es innecesario, y en el `onChange` no llamas a la función `changeName` sino que simplemente pasas la referencia, y es `onChange` quién la llama cuando le corresponda. Saludos
Gracias!, se ve que eres un pro en react
He desarrollado un pequeño formulario de nombre con un botón y una animación de confetti 😁
import { useState } from "react"; const NameForm = () => { const [name, setName] = useState(""); const [lastName, setLastName] = useState(""); return ( <div> <input type="text" placeholder="Stop writing your Name" value={name} onChange={(e) => setName(e.target.value)} /> <br /> <input type="text" placeholder="Stop writing your Last Name" value={lastName} onChange={(e) => setLastName(e.target.value)} /> <p>Hi, {name || "Guest"} {lastName}</p> </div> ) } export default NameForm; ``````js import { useState } from "react"; import './App.css' import NameForm from "./components/NameForm"; import confetti from "canvas-confetti"; function App() { const [submit, setSubmit] = useState(false); const handleClick = async () => { if (submit) return; await new Promise(resolve => setTimeout(resolve, 1500)); setSubmit(true); confetti({ particleCount: 100, spread: 70, }) }; return ( <> <h3>Formulario de Nombre</h3> <NameForm /> <button onClick={handleClick} disabled={submit}> Register here 🐲 </button> </> ) } export default App;
Que bonitooooo ese paquete del confetti es lo mejor jajaja
¿Porque no simplemente el value? ¿Que pasa cuando el estado lo almacena un padre? ¿Que realmente puede ser un estado?, ¿una lista lo puede ser?, ¿o un calculo? Entiende los fundamentos:
🚩Mira esta saga de carruseles y aprende un poco más sobre REAC JS:
import { useState } from "react" const NameForm = () => { const [name, setName] = useState('') return ( <div> <input placeholder="Ingresa tu nombre" value={name} onChange={(event) => setName(event.target.value)} type="text" /> <p>{!name ? "Hola visitante" : `Hola ${name}`}</p> </div> ) } export default NameForm
Ahí vamos
Aqui mi pequeño aporte
import { useState } from "react"; const NameForm = () => { const [name, setName] = useState(""); const [age, setAge] = useState(""); return ( <div> <h2>Formulario de Nombre</h2> <input type="text" value={name} placeholder="Nombre" onChange={(e) => setName(e.target.value)} /> <br /> <input type="number" value={age} placeholder="Edad" onChange={(e) => setAge(e.target.value)} /> <p> Hello, {name || "visitante"}! You are {age} years old. </p> </div> ); }; export default NameForm; ```import { useState } from "react"; const NameForm = () => {   const \[name, setName] = useState("");   const \[age, setAge] = useState("");   return (   \<div>   \<h2>Formulario de Nombre\</h2>   \<input   type="text"   value={name}   placeholder="Nombre"   onChange={(e) => setName(e.target.value)}   />   \<br />   \<input   type="number"   value={age}   placeholder="Edad"   onChange={(e) => setAge(e.target.value)}   />   \<p>   Hello, {name || "visitante"}! You are {age} years old.   \</p>   \</div>   ); }; export default NameForm;
🖱️ Gestión de Eventos en React: Interactividad y Eventos Sintéticos
Resumen Conceptual La gestión de eventos es fundamental para crear aplicaciones React interactivas. Permite capturar acciones del usuario (clics, entradas de texto, etc.) y responder a ellas eficientemente. React simplifica esto mediante su sistema de Eventos Sintéticos, lo que resulta en código más limpio y mantenible.
🔗 Eventos Sintéticos: La Capa de Abstracción
camelCase: En lugar de onclick (HTML), se usa onClick (React). Esto aplica a todos los eventos (ej. onMouseOver, onChange).<button onclick="handleClick()"><button onClick={handleClick}>✍️ El Patrón Fundamental: Evento + Estado
El patrón más común en React es Capturar Evento → Actualizar Estado → Reflejar en la UI.
Ejemplo Práctico: Formulario de Entrada (NameForm)
onChange en el input para detectar cada pulsación de tecla.event:
event sintético.event.target.value.// Actualización en tiempo real onChange={(event) => setName(event.target.value)}
import { useState } from 'react'
function Form (){
const [name, setName]=useState("");
return(
<section>
<input
type="text"
placeholder="Pon tu nombre"
value={name}
onChange={(event)=>setName(event.target.value)}
/>
<h1>hola soy {name}</h1>
</section>
);
}
export default Form
import { useState } from "react";
const NameForm = () => {
const [name, setName] = useState("");
return (
<div>
<input type="text"
placeholder="Ingresa tu nombre"
value={name}
onChange={(event) => setName(event.target.value)}
/>
<p>hola, {name || "visitante"}</p>
</div>
)
}
export default NameForm;
import { useState } from "react";
const Counter = () => {
const [count, setCount] = useState(0);
return (
<div>
<p>El contador esta en: {count}</p>
<button onClick={() => setCount(count + 1)}>Incrementar</button>
<button onClick={() => setCount(count - 1)}>Decrementar</button>
</div>
)
}
export default Counter;
Asi, vamos:
import {useState} from "react";
const NameForm = () => {
const [name,setName] = useState("")
return (
<div>
<input
type="text"
placeholder="Ingresa tu nombre"
value={name}
onChange={(e) => setName (e.target.value)}
/>
<p>Hola, {name || "visitante"}</p>
</div>
)
}
export default NameForm;
import { useState } from "react"; const NameForm = () => { const [name, setName] = useState(''); return ( <> <section> <h1>Formulario</h1> <input type="text" placeholder="Ingresa tu nombre" value={name} onChange={(event) => setName(event.target.value)} /> <p>Hola, {name && name.trim().length > 0 ? name : 'desconocido'}</p> </section> </> ) } export default NameForm;
Por alguna extraña razon, cuando realizo el ejemplo de la clase, todo el programa crashea. Lo intente reseteando todo, incluso comenzando de nuevo, pero cuando creo y uso el componente de FormName no me funcia
Validando espacios vacios para mostrar el texto ingresado
Vamos bien°°
import { useState } from "react";
export const NameForm = () => { const [name, setName] = useState(""); return ( <div> <input type="text" placeholder="Ingresa tu nombre" value={name} onChange={(event) => setName(event.target.value)} /> <p>Hola, {name || "visitante"}</p> </div> )}
Le puse un emoji de chulo para activo y una X para inactivo junto con el texto respectivo:
import { useState } from "react"; export const ToggleButton = () => { const [isActive, setisActive] = useState(false); return ( <button onClick={() => setisActive(!isActive)}> {isActive ? '\u2705 Activo' : '\u274C Inactivo'} </button> )}
Pensé que este curso era para React.JS desde Cero... es decir... el paso-a-paso a detalle, cómo instalar, para que sirve cada cosa que instalas... recuerdo q alguna vez tuvieron un curso así pero ya no lo veo. La profesora es buenísima pero este curso no me funciona para mi como principiante.