Skip to content

Manejo de Eventos en React ​

El manejo de eventos en React es similar al manejo de eventos en JavaScript nativo, pero con diferencias importantes en la sintaxis y el enfoque. React utiliza un sistema de delegación de eventos que mejora el rendimiento y la compatibilidad entre navegadores.


¿Qué son los eventos en React? ​

Los eventos son acciones o interacciones del usuario con la interfaz de una aplicación, como hacer clic en un botón, mover el ratón o escribir en un campo de texto. React gestiona estos eventos mediante su propio sistema, que encapsula los eventos nativos del navegador.


Sintaxis básica ​

En React, los eventos se manejan pasando funciones como valores de atributos en JSX. Los nombres de los eventos utilizan camelCase en lugar de kebab-case, y los manejadores de eventos son funciones en lugar de cadenas de texto.

Ejemplo básico ​

jsx
function App() {
  const handleClick = () => {
    alert('¡Botón clicado!');
  };

  return <button onClick={handleClick}>Haz clic</button>;
}

Eventos comunes ​

React admite una amplia variedad de eventos que puedes manejar en tus componentes. Aquí tienes algunos de los más comunes:

Eventos de mouse ​

  • onClick: Se activa al hacer clic en un elemento.
  • onMouseEnter: Se activa al mover el puntero sobre un elemento.
  • onMouseLeave: Se activa al mover el puntero fuera de un elemento.

Eventos de teclado ​

  • onKeyDown: Se activa al presionar una tecla.
  • onKeyUp: Se activa al soltar una tecla.
  • onKeyPress: (Obsoleto) Similar a onKeyDown, pero menos preciso.

Eventos de formulario ​

  • onChange: Se activa al cambiar el valor de un campo.
  • onSubmit: Se activa al enviar un formulario.

Ejemplo ​

jsx
function Form() {
  const handleChange = (event) => {
    console.log('Valor:', event.target.value);
  };

  const handleSubmit = (event) => {
    event.preventDefault();
    alert('Formulario enviado');
  };

  return (
    <form onSubmit={handleSubmit}>
      <input type="text" onChange={handleChange} />
      <button type="submit">Enviar</button>
    </form>
  );
}

Propagación de eventos ​

En React, los eventos se propagan desde el elemento donde ocurrieron hacia sus ancestros (bubbling). Puedes controlar este comportamiento utilizando el método stopPropagation.

Ejemplo ​

jsx
function Parent() {
  const handleParentClick = () => {
    console.log('Clic en el padre');
  };

  const handleChildClick = (event) => {
    event.stopPropagation();
    console.log('Clic en el hijo');
  };

  return (
    <div onClick={handleParentClick} style={{ padding: '20px', background: '#f0f0f0' }}>
      <button onClick={handleChildClick}>Hijo</button>
    </div>
  );
}

En este ejemplo, el clic en el botón no activará el evento del contenedor debido al uso de stopPropagation.


Binding de métodos ​

En componentes de clase, los métodos no están vinculados automáticamente al contexto del componente. Esto puede causar problemas al usar this en manejadores de eventos.

Solución con binding manual ​

jsx
class App extends React.Component {
  constructor(props) {
    super(props);
    this.handleClick = this.handleClick.bind(this);
  }

  handleClick() {
    console.log('Clicado:', this);
  }

  render() {
    return <button onClick={this.handleClick}>Haz clic</button>;
  }
}

Solución con funciones flecha ​

jsx
class App extends React.Component {
  handleClick = () => {
    console.log('Clicado:', this);
  };

  render() {
    return <button onClick={this.handleClick}>Haz clic</button>;
  }
}

Eventos personalizados ​

Puedes definir eventos personalizados pasando funciones desde un componente padre a un componente hijo como props.

Ejemplo ​

jsx
function Child({ onAction }) {
  return <button onClick={() => onAction('Evento personalizado')}>Haz clic</button>;
}

function Parent() {
  const handleAction = (message) => {
    alert(message);
  };

  return <Child onAction={handleAction} />;
}

Conclusiones ​

El manejo de eventos en React es un proceso sencillo y poderoso que permite capturar y responder a interacciones del usuario. Dominar los eventos y su propagación es clave para crear interfaces interactivas y dinámicas.