No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Curso de Introducción a React.js

Curso de Introducción a React.js

Juan David Castro Gallego

Juan David Castro Gallego

Manejo de eventos

8/23
Recursos

Manejar eventos en React es muy similar a manejar eventos en el DOM, solo necesitamos pasarle una propiedad on + evento, por ejemplo: onClick, onChange, onMouseOver, que será igual a una función en la que estará el código que se ejecutará cuando ocurra dicho evento.

A diferencia de los eventos del DOM, para manejar eventos en React tenemos unas pequeñas diferencias en la sintaxis:

  1. En React los eventos son nombrados usando camelCase.
  2. Tenemos que pasar una función, ya sea en línea o almacenada en una variable.
  3. No puedes regresar false para prevenir el comportamiento por defecto, debes utilizar preventDefault explícitamente.

HTML

<button onclick="click()">button>

React

<button onClick={click}>button>

Pasando argumentos a escuchadores de eventos

En React no tenemos que ejecutar el código nosotros, React ya maneja esto por debajo, solo es necesario pasar una función, React solito la ejecutará cuando ocurra el evento que estemos escuchando.

Si necesitamos pasar argumentos a nuestras funciones, necesitamos encerrar nuestra función dentro de otra función, esto porque al pasarle argumentos a una función la estamos ejecutando, veamos un ejemplo:

function CreateTodoButton(props) {
  const onClickButton = (msg) => {
    alert(msg);
  };
  
  return (
    <>
        {/* ✅ */}
        <button
          className="CreateTodoButton"
          onClick={() => onClickButton('Aquí se debería abrir el modal')}
        >
          +
        button>
        {/* ❌ */}
        <button
          className="CreateTodoButton"
          onClick={onClickButton('Esta función se ejecuta al inicio, no al presionar el botón'}
        >
          +
        button>
    
  );
}

✅ Es importante siempre pasar una función.

Dentro de estos eventos también puedes recibir como parámetro la información del evento, en donde puedes encontrar propiedades muy interesantes, como por ejemplo, el valor de algún input, con event.target.value.

function TodoSearch() {
  const onSearchValueChange = (event) => {
    console.log(event.target.value);
  };
  
  return (
    <input
      className="TodoSearch"
      placeholder="Cebolla"
      onChange={onSearchValueChange}
    />
  );
}

Contribución creada por: Brandon Argel.

Aportes 54

Preguntas 19

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

o inicia sesión.

☝ Por si no entendiste bien por qué a veces enviamos arrow functions y por qué otras veces no, aquí te lo explico:
.
Cualquier evento recibe sí o sí una función, es decir, debemos mandarle sí o sí una función para que React internamente pueda ejecutarla en cuanto dicho eventop ocurre.
.
El asunto, es que tiene que ser sí o sí una función que React pueda ejecutar, por eso no podemos mandar directamente un console.log() ni un alert(), porque aunque ambos son funciones, nosotros estamos ejecutándolas directamente al ponerles los paréntesis, pero nosotros no debemos ejecutarlas, nosotros solo debemos mandarlas y ya React se encargará de ejecutarlas.
.
Es por eso que mandamos arrow functions, porque estas son funciones que React puede ejecutar cuando quiera, y pues dentro de esas arrow functions está el código que queremos ejecutar cuando el evento suceda.
.

onClick={() => alert("React sí puede ejecutar esta arrow function cada que le de la gana OwO")}

.
Sin embargo, recordando que los eventos reciben funciones, yo puedo crear una variable que dentro guarde una función, por ejemplo:
.

const adentroTengoUnaFuncion = () => {
    console.log("Hola");
    console.log("Soy una función que está siendo guardada dentro de una variable UwU");
}

.
Yo puedo ejecutar esta función sin problemas de esta forma adentroTengoUnaFuncion(), pero también puedo mandarsela a React para que él lo ejecute cuando quiera (en este caso, cuando el evento suceda):
.

onClick={adentroTengoUnaFuncion}

.
Nota como aquí mandamos la función sin paréntesis, esto es porque en el momento en el que le ponemos paréntesis seríamos nosotros quienes ejecutan la función, pero recuerda que nosotros no debemos ejecutar la función, sino React es quien tiene que ejecutarla. ¿Por qué? Pues porque si la ejecutamos nosotros, esta se va a ejecutar justo en el momento que esa línea de código sea leída por nuestra computadora, y nosotros no queremos eso, nosotros queremos que nuestra función se ejecute únicamente cuando el evento suceda, por eso la mandamos sin paréntesis, para que React pueda ejecutarla cuando dicho evento ocurra 😄
.
Peeeeeero, podemos hacer algo genial (y puede ponerse complicado), no veo razón para hacer esto, pero te lo explico por alimentar tu curiosidad jaja:
.
Sí podemos ejecutar nosotros la función 👀… Yo sé, esto es totalmente lo contrario a lo que te acabo de decir, pero checa esto 👇
.
Nosotros sí podemos hacer esto:
.

onClick={adentroTengoUnaFuncion()}

Solamente sí nuestra función está así:
.

const adentroTengoUnaFuncion = () => {
    return () => {
        console.log("Hola");
        console.log("Soy una función que está siendo guardada dentro de una variable UwU");
    }
}

.
Wait… what? Es simple 👀 Mi función adentroTengoUnaFuncion está retornando otra función, eso significa que, en el momento que mi código se ejecute, mi función adentroTengoUnaFuncion también se va a ejecutar inmediatamente, pero como esta función está retornando otra función, al final mi evento onClick acabará recibiendo la función que necesita para funcionar!!! OwO
.
¿Por qué haríamos esto? Seguramente tenga algún caso de uso, pero también es interesante saber que se pueden hacer este tipo de cosas UwU

Creo que me estoy enamorando de React.

7.-Manejo de eventos (internos)

En react todo lo que empiece con on nos va a ayudar a recibir los eventos de nuestros usuarios al cual le vamos a enviar una función que se ejecute cuando los usuarios ejecuten la acción que estamos escuchando. Si no usamos una arrow function el código se va a ejecutar de una, se tiene que envolver en una función para que se ejecute cuando sea necesario, en este caso cuando se de click.

<button className="CreateTodoButton" onClick={() => console.log("click")}>

Los eventos también se pueden crear guardando la función en una constante, y al momento de llamarlo solo se nombra.

const onClickButton = () =>{
alert('Aquí debería ir el modal');

};

return (

<button className="CreateTodoButton" onClick={onClickButton}>

+

</button>

);

o

const onClickButton = (*msg*) => {
	alert(*msg*);
	
	};
	
	return (
	
	<button
	
	className="CreateTodoButton"
	
	onClick={() => onClickButton("Aquí va el modal:)")}
	
	>
	
	+
	
	</button>
	
);

Los nombres de eventos en React comienzan con “on” y luego el primer caracter de cada palabra en mayúsculas:

onClick
onDoubleClick
onMouseEnter
onMouseLeave
onMouseMove
onKeyPress
onKetUp
onSubmit

when changing the input called the event onChange the callback appears as a synthetic-event the reason for appearing a synthetic-event and no event is that the event is a trigger for jsx and not for HTML it is important recognize this difference because all events are remapped because jsx is not a html

para escuchar el clik del boton = onClick
para escuchar el valor de nuestro input = onChange

Estos video han de grabarlos tarde en la noche, JuanDC se ve súper emocionado, pero no sube la voz… ¡que buen vecino!

Que feliz me siento que al fin entiendo como funciona el target!!! lo explica muy sencillo

haha me encanta la emoción del instructor, 13:40 se nota cuando disfrutan su trabajo

Ohhh, esta clase me encantó!!

me di cuenta de que también se puede insertar el mensaje de la alerta a partir de una variable llamándola como argumento de onClickButton dentro del evento onClick ,no se que utilidad práctica puede tener o si a lo lejos es una bueno practica( soy nuevo en react ) pero es bueno saber que se puede 👍.

se declararía de esta forma:

function CreateTodoButton() {

    let mesag = 'holap'

    const onClickButton = (msg) => {
        alert(msg);
    }

    return(
        <button 
        className="CreateTodoButton"
        onClick={ () => onClickButton(mesag) }
        >
             +
        </button>
    );
}

Una forma de poder enviar los mensajes tambien:

let onComplete = () => {
    alert(`Has completado la tarea ${props.text}`)
  }

Yo solo debo decir algo, y espero el director course no me banee mi cuenta de Platzi pero.

Team Iron Man ♥

Funciona como un callback, mas o menos, la forma en la que usamos los eventos

Mis aportes a la clase, en caso que alguien le ayude por el lado de TS.

//button.tsx
type newTodoType = string;

const Button = () => {

  const onClickButton = (message: newTodoType) => {
    console.log('completed', message);
  };

  return (
    <div className="p-6 flex justify-center">
      <button
        className="border-2 w-52 hover:bg-gray-50"
        onClick={() => onClickButton('click!!')}
      >
        +
      </button>
    </div>
  );
};

Aca, vale la pena aclarar algo:
button debe recibir un argumento, que cuando se ejecute el evento onClick, va a desencadenar el console.log
Por otro lado, en todo-item, las funciones anonimas solamente expresan una ejecucion, su referencia puede pasarse al argumento del onClick

.

// todo-item.tsx
type ItemProps = {
  text: string;
  completed: boolean;
}

const TodoItem = (props: ItemProps) => {

  const onCompleted = () => {
    console.log('Completaste todo', props.text);
  };
  const onDeleted = () => {
    console.log('Eliminaste todo', props.text);
  };
  
  return (
    <li className="grid grid-cols-3 items-center gap-3 my-2 text-center w-full border-b-2">
      <span 
        className="cursor-pointer hover:bg-green-700 hover:text-gray-100"
        onClick={onCompleted}
      ></span>
      <p className={`${props.completed && 'line-through'}`}>
        {props.text}
      </p>
      <span
        className="cursor-pointer hover:bg-red-600 text-gray-400 hover:text-gray-100"
        onClick={onDeleted}
      >
        X
      </span>
    </li>
  );
};

.
Ahora, en el lado del componente todo-search, en la creacion de la funcion, esta siendo pasado un argumenbto event al evento onChange. Lo que ocurre es que

los eventos onChange devuelven un objeto de tipo evento sintético (Sythetic Event) que contiene metadatos útiles, como el id, name y el value actual del input.

// todo-search
const TodoSearch = () => {
  const onSearchEvent = (event: any) => {
    console.log('', event.target.value)
  }

  return (
    <div className="p-6 flex justify-center">
      <input
        type="text"
        className="border p-2 border-slate-300 hover:border-b-indigo-900 focus:outline-none"
        placeholder='Buscar o crear nueva tarea'
        onChange={onSearchEvent}
      />
    </div>
  );
};

Analizo y concluyó que Un evento es un proceso asíncrono, por eso los eventos piden una funcion (callback, función que pasa como argumento de otra función para poder generar un código asíncrono)

Exelente Curso💚

Ya había hecho un curso de react el año pasado, me gusto la herramienta; regrese por otro para aclarar muchas dudas y refrescar la memoria, y, francamente, siento como si estuviera aprendiendo react por primera vez. Amo la forma de explicar de este profesor, todo muy claro, hace que todo parezca tan sencillo…

“Tenemos que volver a envolver nuestra arrow function en otra arrow function”

Creo que fué una buena idea dominar vue primero antes de meterse con React, creo que vue permite entender estos conceptos de una manera más sencilla. OJO, no estoy comparando frameworks, solo que en mi experiencia vue es mucho más amigable al principiante que React. Habiendo dicho esto, React me esta gustando bastante

Excelente clase! Lo explicó mejor que Fernando Herrera!!!!!

excelente la manera que explica

me parece que explico muy bien la parte de donde sale el value. event.target.value , asi cada quien puede mirar que otra cosa necesita hacer en su codigo

Busqué la manera de hacer un Delay que en realidad el nombre correcto es debounce, como buena práctica para esperar medio segundo antes de ejecutar la función y ya que exista una conexión a la BD, solo hacer 1 llamada ya que el usuario haya terminado de escribir, esta fue mi solución.

Estoy utilizando MUI para la creación de estilos

import React, { useState, useEffect  } from 'react';
import TextField from '@mui/material/TextField';


function TodoSearch() {
    const [query, setQuery] = useState("");
    
    useEffect(() => {
        const timeOutId = setTimeout(() => console.log(query), 500);
        return () => clearTimeout(timeOutId);
    }, [query]);

    const onSearchValueChange = (e) => {
        setQuery(e.target.value)
    }
    return (
        <TextField 
        label="Search Task" 
        variant="standard" 
        fullWidth
        value={query}
        onChange={onSearchValueChange}/>
    );
}

export { TodoSearch }```

Parce!! Juan definitivamente contagia con su forma de ser, es único el chino!!
Gracias Profe 😃

Esto va de cero a amor a primera vista 💙😂

Increible.

asi va quedando, excelente

Como lo veo cada vez que hago un npm start

Aclaración: ejecución funciones en un prop al renderizar si no estan contenidas en una función.

Si el codigo JS viene definido directamente en el evento, react la autoejecuta al momento de renderear el DOM. Ejemplo:

onClick={console.log('mi mensaje')}

Para prevenir la autoejecucion utlizamos un arrow function. Ejemplo:

onClick= { () => { console.log('mi mensaje') } }

Tambien podemos guardar la funcion en una variable y pasarsela como parametro:
Ejemplo:

const myFn = (data) => { 
	console.log('mi mensaje', data)
}; 
onClick= { () => myFn('montoyita') }

Ademas, si la funcion no recibe parametros podemos nombrarla sin necesidad de agregar a un arrow function:
Ejemplo:

const myFn = () => { 
	console.log('mi mensaje')
}; 
onClick= {myFn}

Manejo de EVENTOS

-onClick
-onChange
-onMouserOver

Se nombran con camelCase, pasamos una funcion en linea o almacenada en variable, usamos preventDefault.
Pasar funciones como argumentos, encerradas en otra funcion.

Podemos obtener informacion como el valor de un input usando event.target.value

Eventos disponibles
React incluye eventos de:
teclado omo onKeyUp, onKeyPress, onKeyDown;
mouse como onClick, onMouseMove, onDragOut, onDrop, etc.
de formularios, como onChange, onInput, onInvalid, onSubmit

Excelente Clase! La verdad me impresiona mucho los ejemplos que con ellos se entiende cada cosa que se va realizando. Fue una clase muy bien aportada

Yo habia empezado con otro curso de Ract y practicamente lo odie aqui en Platzi, pero este de introduccion antes me enamora cada vez mas ❤️

Excelente curso hasta el momento!

Al fin pude ver de donde usan tantos métodos y propiedades 😦

manejo de eventos con todos

manejo de eventos cambios de estilos todos
combinando colores y diferentes estilos

import React from "react";
import './TodoSearch.css';

function TodoSearch(){
    const onSearchValueChange = (event)=>{
        console.log(event.target.value)
    }
    return(
        <input 
            className="TodoSearch" 
            placeholder="Cebolla"
            onChange={onSearchValueChange}
        />
    );
}

export {TodoSearch};

La verdad eres muy gran profesor UwU

Este pudo ser un curso práctico de React.js y no de Introducción a React.js
juan comete errores o hay cosas que menciona muy a la ligera como las props que solo tomó un minuto para decir que las usaría.
Me hace pensar que este curso lo improvisó o se lo preparó una noche antes. Usar una raíz cuadrada en vez de usa una palomita en el proyecto pff hasta una búsqueda rápida en google sale.
Agradezco al buen RetaxMaster por de nuevo complementar los conocimientos en los cursos.

Excelente curso, la voz del profe parece de un personaje animado xd

Excelente clase, por fin pude entender para que sirve el target.

TAANNNNNNNNNNTASSSSSSSS VUELTAS !!!

Wow demasiado duro

completando los todos


manejo de eventos

creando manejo de eventos

Pregunta de examen:
¿Cómo escuchamos el evento de click en un botón con React?

Wow, se me acaba de ocurrir utilizar un filter y un find para filtrar las bsuquedas de losnusuarios a un array de tareas, me esta gustando mucho react. ¿Como se hsria SEO ha una pagina en react ? , el html literalmente esta vacio? tengo un muchas dudas
Creo que vamos a hacer de la forma mas simple lo de completar tareas mas adelante, creo que tal vez vamos a utilizar removeClass ? para quitar los
  • o tareas que ya completamos o algo similar ...
  • Recorde a los callbacks cuando llamo a la arrow function alert con otra arrow function es algo confuso a veces

    Pregunta de examen:
    ¿Cómo escuchamos cuando los usuarios envíen un formulario con React?