11.1-eventos

 

Tutorial Sencillo de Eventos en React-Ejemplo 1: Eventos de Click Básico

Componente Padre: App.js

function App() {

  return (

    <div>

      <h1>Eventos de Click</h1>

      <EjemploClick />

    </div>

  );

}

Componente Hijo: EjemploClick.js

import { useState } from 'react';


function EjemploClick() {

  const [contador, setContador] = useState(0);

  const [texto, setTexto] = useState('Haz click');


  function handleClick() {

    setTexto('¡Click!');

    setContador(contador + 1);

  }


  function resetear() {

    setContador(0);

    setTexto('Haz click');

  }

  return (

    <div style={{padding: '10px', border: '1px solid gray'}}>

      <h3>Contador: {contador}</h3>

      

      <button onClick={handleClick} style={{margin: '5px'}}>

        {texto}

      </button>

      <button onClick={resetear} style={{margin: '5px'}}>

        Resetear

      </button>

      <button onClick={() => setTexto('Click directo')} style={{margin: '5px'}}>

        Cambiar texto

      </button>

    </div> );}

Ejemplo 2: Formulario Simple

Componente Padre: App.js

jsx

function App() {

  return (

    <div>

      <h1>Formularios</h1>

      <FormularioSimple />

    </div>

  );

}

Componente Hijo: FormularioSimple.js

jsx

import { useState } from 'react';


function FormularioSimple() {

  const [nombre, setNombre] = useState('');

  const [email, setEmail] = useState('');

  const [mensaje, setMensaje] = useState('');


  function handleSubmit(e) {

    e.preventDefault(); // Evita que se recargue la página

    setMensaje(`Enviado: ${nombre} (${email})`);

    

    // Limpiar campos

    setNombre('');

    setEmail('');

  }


  function handleReset() {

    setNombre('');

    setEmail('');

    setMensaje('');

  }


 




 return (

    <div style={{padding: '10px', border: '1px solid gray'}}>

      <form onSubmit={handleSubmit}>

        <div style={{margin: '10px 0'}}>

          <input

            type="text"

            value={nombre}

            onChange={(e) => setNombre(e.target.value)}

            placeholder="Tu nombre"

            style={{padding: '5px'}}

          />

        </div>

        

        <div style={{margin: '10px 0'}}>

          <input

            type="email"

            value={email}

            onChange={(e) => setEmail(e.target.value)}

            placeholder="Tu email"

            style={{padding: '5px'}}

          />

        </div>

        

        <button type="submit" style={{margin: '5px'}}>Enviar</button>

        <button type="button" onClick={handleReset} style={{margin: '5px'}}>Limpiar</button>

      </form>

      

      {mensaje && <p><strong>{mensaje}</strong></p>}

    </div>

  );

}




Ejemplo 3: Eventos de Teclado-Componente Padre: App.js

function App() {

  return (

    <div>

      <h1>Eventos de Teclado</h1>

      <EventosTeclado />

    </div>

  );

}

Componente Hijo: EventosTeclado.js

import { useState } from 'react';


function EventosTeclado() {

  const [texto, setTexto] = useState('');

  const [ultimaTecla, setUltimaTecla] = useState('');


  function handleKeyDown(e) {

    setUltimaTecla(e.key);

    

    if (e.key === 'Enter') {

      setTexto(texto + '[Enter] ');

    }

    

    if (e.key === 'Escape') {

      setTexto('');

    }

  }


  function limpiar() {

    setTexto('');

    setUltimaTecla('');

  }


  return (

    <div style={{padding: '10px', border: '1px solid gray'}}>

      <textarea

        value={texto}

        onChange={(e) => setTexto(e.target.value)}

        onKeyDown={handleKeyDown}

        placeholder="Escribe aquí..."

        style={{width: '300px', height: '100px', padding: '5px'}}

      />

      <div style={{marginTop: '10px'}}>

        <button onClick={limpiar}>Limpiar</button>

      </div>

      <div style={{marginTop: '10px'}}>

        <p>Última tecla: <strong>{ultimaTecla || 'ninguna'}</strong></p>

        <p>Caracteres: <strong>{texto.length}</strong></p>

      </div>

    </div>

  );

}

Ejemplo 4: Eventos de Mouse

Componente Padre: App.js

jsx

function App() {

  return (

    <div>

      <h1>Eventos de Mouse</h1>

      <EventosMouse />

    </div>

  );

}

Componente Hijo: EventosMouse.js

jsx

import { useState } from 'react';


function EventosMouse() {

  const [clicks, setClicks] = useState(0);

  const [mouseDentro, setMouseDentro] = useState(false);


  function handleClick() {

    setClicks(clicks + 1);

  }


  function handleMouseEnter() {

    setMouseDentro(true);

  }


  function handleMouseLeave() {

    setMouseDentro(false);

  }


  function resetear() {

    setClicks(0);

  }


  return (

    <div style={{padding: '10px', border: '1px solid gray'}}>

      <div

        onClick={handleClick}

        onMouseEnter={handleMouseEnter}

        onMouseLeave={handleMouseLeave}

        onDoubleClick={resetear}

        style={{

          width: '200px',

          height: '100px',

          border: '2px solid blue',

          backgroundColor: mouseDentro ? 'lightblue' : 'white',

          margin: '10px 0',

          padding: '10px',

          textAlign: 'center',

          cursor: 'pointer'

        }}

      >

        <h3>Área Interactiva</h3>

        <p>Haz click aquí</p>

      </div>

      

      <div>

        <p>Clicks: <strong>{clicks}</strong></p>

        <p>Mouse dentro: <strong>{mouseDentro ? 'Sí' : 'No'}</strong></p>

      </div>

    </div>

  );

}



Ejemplo 5: Lista de Tareas (Todo List)

Componente Padre: App.js

jsx

function App() {

  return (

    <div>

      <h1>Lista de Tareas</h1>

      <TodoList />

    </div>

  );

}

Componente Hijo: TodoList.js

jsx

import { useState } from 'react';


function TodoList() {

  const [tareas, setTareas] = useState([]);

  const [nuevaTarea, setNuevaTarea] = useState('');


  function agregarTarea(e) {

    e.preventDefault();

    

    if (nuevaTarea.trim() === '') return;

    

    setTareas([...tareas, {

      id: Date.now(),

      texto: nuevaTarea,

      completada: false

    }]);

    

    setNuevaTarea('');

  }


  function eliminarTarea(id) {

    setTareas(tareas.filter(tarea => tarea.id !== id));

  }


  function toggleCompletada(id) {

    setTareas(tareas.map(tarea => {

      if (tarea.id === id) {

        return { ...tarea, completada: !tarea.completada };

      }

      return tarea;

    }));

  }


  function limpiarTodas() {

    setTareas([]);

  }


  return (

    <div style={{padding: '10px', border: '1px solid gray'}}>

      <form onSubmit={agregarTarea}>

        <input

          type="text"

          value={nuevaTarea}

          onChange={(e) => setNuevaTarea(e.target.value)}

          placeholder="Nueva tarea..."

          style={{padding: '5px', marginRight: '5px'}}

        />

        <button type="submit">Agregar</button>

      </form>

      

      <div style={{marginTop: '10px'}}>

        {tareas.length === 0 ? (

          <p>No hay tareas</p>

        ) : (

          <ul style={{listStyle: 'none', padding: 0}}>

            {tareas.map(tarea => (

              <li key={tarea.id} style={{margin: '5px 0'}}>

                <input

                  type="checkbox"

                  checked={tarea.completada}

                  onChange={() => toggleCompletada(tarea.id)}

                  style={{marginRight: '10px'}}

                />

                

                <span style={{

                  textDecoration: tarea.completada ? 'line-through' : 'none'

                }}>

                  {tarea.texto}

                </span>

                

                <button

                  onClick={() => eliminarTarea(tarea.id)}

                  style={{marginLeft: '10px'}}

                >

                  Eliminar

                </button>

              </li>

            ))}

          </ul>

        )}

      </div>

      

      {tareas.length > 0 && (

        <button onClick={limpiarTodas} style={{marginTop: '10px'}}>

          Limpiar todas

        </button>

      )}

      

      <div style={{marginTop: '10px'}}>

        <p>Tareas: {tareas.length}</p>

        <p>Completadas: {tareas.filter(t => t.completada).length}</p>

      </div>

    </div>

  );

}







Ejemplo 6: Componente Reutilizable con Eventos

Componente Padre: App.js

function App() {

  const productos = [

    { id: 1, nombre: "Laptop", precio: 800 },

    { id: 2, nombre: "Mouse", precio: 25 },

    { id: 3, nombre: "Teclado", precio: 50 }

  ];


  function manejarCompra(producto) {

    alert(`Comprado: ${producto.nombre} - $${producto.precio}`);

  }


  return (

    <div>

      <h1>Tienda</h1>

      {productos.map(producto => (

        <Producto

          key={producto.id}

          producto={producto}

          onCompra={manejarCompra}

        />

      ))}

    </div>

  );

}

Componente Hijo: Producto.js

function Producto({ producto, onCompra }) {

  return (

    <div style={{

      border: '1px solid #ccc',

      padding: '10px',

      margin: '10px 0'

    }}>

      <h3>{producto.nombre}</h3>

      <p>Precio: ${producto.precio}</p>

      <button onClick={() => onCompra(producto)}>

        Comprar

      </button>

    </div>  );}

Ejemplo 7: Eventos con Parámetros

Componente Padre: App.js

jsx

function App() {

  function saludar(nombre) {

    alert(`¡Hola ${nombre}!`);

  }


  return (

    <div>

      <h1>Saludos</h1>

      <button onClick={() => saludar('Juan')}>

        Saludo a Juan

      </button>

      

      <button onClick={() => saludar('María')}>

        Saludo a María

      </button>

      

      <button onClick={() => saludar('Pedro')}>

        Saludo a Pedro

      </button>

    </div>

  );

}






Ejemplo 8: Select y Checkbox-Componente Padre: App.js

function App() {

  return (

    <div>

      <h1>Select y Checkbox</h1>

      <SelectCheckbox />

    </div>

  );

}

Componente Hijo: SelectCheckbox.js

jsx

import { useState } from 'react';


function SelectCheckbox() {

  const [opcion, setOpcion] = useState('opcion1');

  const [acepto, setAcepto] = useState(false);


  function manejarSubmit(e) {

    e.preventDefault();

    alert(`Opción: ${opcion}, Aceptado: ${acepto}`);

  }


  return (

    <div style={{padding: '10px', border: '1px solid gray'}}>

      <form onSubmit={manejarSubmit}>

        <div style={{margin: '10px 0'}}>

          <select 

            value={opcion} 

            onChange={(e) => setOpcion(e.target.value)}

            style={{padding: '5px'}}

          >

            <option value="opcion1">Opción 1</option>

            <option value="opcion2">Opción 2</option>

            <option value="opcion3">Opción 3</option>

          </select>

        </div>

        

        <div style={{margin: '10px 0'}}>

          <label>

            <input

              type="checkbox"

              checked={acepto}

              onChange={(e) => setAcepto(e.target.checked)}

              style={{marginRight: '5px'}}

            />

            Acepto los términos

          </label>

        </div>

        

        <button type="submit">Enviar</button>

      </form>

      

      <div style={{marginTop: '10px'}}>

        <p>Opción seleccionada: <strong>{opcion}</strong></p>

        <p>Aceptado: <strong>{acepto ? 'Sí' : 'No'}</strong></p>

      </div>

    </div>

  );

}

Resumen de Eventos

jsx

// 1. Click básico

<button onClick={funcion}>Click</button>


// 2. Click con parámetro (usar arrow function)

<button onClick={() => funcion(parametro)}>Click</button>


// 3. Cambio en input

<input onChange={(e) => setValor(e.target.value)} />


// 4. Formulario

<form onSubmit={(e) => {

  e.preventDefault();

  // tu código

}}>


// 5. Teclado

<input onKeyDown={(e) => {

  if (e.key === 'Enter') {

    // tu código

  }

}} />


// 6. Mouse

<div

  onClick={handleClick}

  onMouseEnter={handleMouseEnter}

  onMouseLeave={handleMouseLeave}

>


// 7. No hacer esto (ejecuta función al renderizar)

<button onClick={funcion()}>MAL</button>


// 8. Esto es correcto

<button onClick={funcion}>BIEN</button>

<button onClick={() => funcion(parametro)}>BIEN</button>

App Completa con Todos los Ejemplos

jsx

function App() {

  return (

    <div style={{padding: '20px'}}>

      <h1>Tutorial de Eventos en React</h1>

      

      <EjemploClick />

      <hr />

      

      <FormularioSimple />

      <hr />

      

      <EventosTeclado />

      <hr />

      

      <EventosMouse />

      <hr />

      

      <TodoList />

      <hr />

      

      <SelectCheckbox />

    </div>

  );

}

Este tutorial simplificado muestra los eventos más importantes en React con ejemplos claros y concisos. Cada ejemplo tiene su propio componente padre e hijo separados para mejor organización.


Comentarios

Entradas más populares de este blog

9.3-Tutorial de Componentes React con Props -SSS

9.6-Ciclo de Vida de un Componente React

9-Componentes en React-estado