Los eventos hacen que tu web sea interactiva. Cuando alguien hace clic en un botón, escribe en un input, o pasa el mouse sobre algo, sucede algo. En React, manejar eventos es simple: solo necesitas una función y un atributo.
El evento más común. Se dispara cuando alguien hace clic en un elemento.
export default function App() {
// Función que se ejecuta al hacer clic
const handleClick = () => {
alert("¡Hiciste clic!");
};
return (
<div>
<button onClick={handleClick}>
Haz clic
</button>
</div>
);
}
¡Importante!
onclick (minúsculas). En React es onClick (camelCase).onClick={handleClick}, no onClick={handleClick()}.handleClick(), la función se ejecuta inmediatamente.A veces es más conveniente escribir la función directamente en el evento.
export default function App() {
return (
<div>
<!-- Forma 1: Función anónima -->
<button onClick={() => alert("¡Clic!")}>
Botón 1
</button>
<!-- Forma 2: Función con lógica -->
<button onClick={() => {
console.log("Botón presionado");
alert("Hola!");
}}>
Botón 2
</button>
</div>
);
}
React pasa automáticamente el objeto del evento a tu función.
export default function App() {
const handleClick = (event) => {
console.log(event); // Objeto del evento
console.log(event.target); // El elemento que fue clickeado
console.log(event.target.textContent); // El texto del botón
};
return (
<button onClick={handleClick}>
Haz clic
</button>
);
}
Puedes pasar funciones como props para que los componentes hijos ejecuten lógica del padre.
// Componente hijo que recibe una función como prop
function Boton({ texto, onClick }) {
return (
<button onClick={onClick}>
{texto}
</button>
);
}
// Componente padre
export default function App() {
const handleGuardar = () => {
alert("¡Guardado!");
};
const handleEliminar = () => {
alert("¡Eliminado!");
};
return (
<div>
<Boton texto="Guardar" onClick={handleGuardar} />
<Boton texto="Eliminar" onClick={handleEliminar} />
</div>
);
}
Los eventos más usados en React.
Se dispara al hacer clic.
<button onClick={() => console.log("Clic")}>
Botón
</button>
Se dispara cuando cambia el valor de un input.
<input
onChange={(e) => console.log(e.target.value)}
/>
Se dispara al enviar un formulario.
<form onSubmit={(e) => {
e.preventDefault();
console.log("Formulario enviado");
}}>
<button type="submit">Enviar</button>
</form>
Se dispara al pasar/salir el mouse.
<div
onMouseEnter={() => console.log("Entraste")}
onMouseLeave={() => console.log("Saliste")}
>
Pasa el mouse
</div>
Se dispara al enfocar/desenfocarse un input.
<input
onFocus={() => console.log("Enfocado")}
onBlur={() => console.log("Desenfocado")}
/>
Se dispara al presionar/soltar una tecla.
<input
onKeyDown={(e) => {
if (e.key === "Enter") {
console.log("Presionaste Enter");
}
}}
/>
Crea un contador que aumenta y disminuye al hacer clic.
import { useState } from 'react';
export default function Contador() {
const [numero, setNumero] = useState(0);
const aumentar = () => {
setNumero(numero + 1);
};
const disminuir = () => {
setNumero(numero - 1);
};
const reiniciar = () => {
setNumero(0);
};
return (
<div className="contador">
<h1>{numero}</h1>
<button onClick={aumentar}>+</button>
<button onClick={disminuir}>-</button>
<button onClick={reiniciar}>Reiniciar</button>
</div>
);
}
Crea un formulario que capture datos del usuario.
import { useState } from 'react';
export default function Formulario() {
const [nombre, setNombre] = useState("");
const [email, setEmail] = useState("");
const handleSubmit = (e) => {
e.preventDefault();
console.log(f"Nombre: {nombre}, Email: {email}");
// Aquí enviarías los datos a un servidor
setNombre("");
setEmail("");
};
return (
<form onSubmit={handleSubmit}>
<input
type="text"
placeholder="Nombre"
value={nombre}
onChange={(e) => setNombre(e.target.value)}
/>
<input
type="email"
placeholder="Email"
value={email}
onChange={(e) => setEmail(e.target.value)}
/>
<button type="submit">
Enviar
</button>
</form>
);
}
Crea una lista donde puedas agregar y eliminar tareas.
import { useState } from 'react';
export default function ListaTareas() {
const [tareas, setTareas] = useState([]);
const [input, setInput] = useState("");
const agregarTarea = () => {
if (input.trim()) {
setTareas([...tareas, { id: Date.now(), texto: input }]);
setInput("");
}
};
const eliminarTarea = (id) => {
setTareas(tareas.filter((tarea) => tarea.id !== id));
};
return (
<div>
<h1>Mi Lista de Tareas</h1>
<div>
<input
type="text"
value={input}
onChange={(e) => setInput(e.target.value)}
placeholder="Nueva tarea..."
/>
<button onClick={agregarTarea}>Agregar</button>
</div>
<ul>
{tareas.map((tarea) => (
<li key={tarea.id}>
{tarea.texto}
<button onClick={() => eliminarTarea(tarea.id)}>
Eliminar
</button>
</li>
))}
</ul>
</div>
);
}
Usa CodeSandbox (React).
Boton que reciba una función onClick como prop.