Manejo de eventos
Clase 8 de 23 • Curso de React 17
Contenido del curso
Clase 8 de 23 • Curso de React 17
Contenido del curso
Carlos Eduardo Gomez García
Luis Alejandro Vera Hernandez
Máximo Calderon
Christian Alvarenga
Reinaldo Mendoza
Omar Gabriel Aguilar Moscoso
Juan Pablo Jimenez
Nelson Gonzalez Escalante
Reinaldo Mendoza
Ramses Acosta
Juan Castro
Miguel Ángel Bolaños Quiñonez
cindy yurley caceres parada
Yancarlo Urdaneta
Luis Felipe Silgado Cortázar
Juan Castro
Carlos Matias Avanzini
Ángel David Lerma Carrera
Carlos Andrés Pupiales Córdoba
Elias Estrabao
Diego Manso Padilla
Joger Alexander Hernandez Colina
Julian Franco
Reinaldo Mendoza
Carlos Rafael Córdova Flores
Adan Uri Plata Estrada
Vanessa Cordero
Guillermo Castaño Vèlez
Andrés Felipe Eslava Zuluaga
Jose Ramon Garcia Sterling
Juan Castro
Dany R
José David Montes Martinez
Leandro Andres Suarez Vece
☝ 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 :D . 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
Gracias por el aporte y ensenarnos esos distintos casos de uso. Muy útil e interesante
Un saludo.... Este último caso mostrado es un ejemplo de los que se conoce como "closure" en JavaScript....
Creo que me estoy enamorando de React.
Al principio cuesta pero luego me empezó a gustar mas que solo escribir etiquetas html ala antigua
x2
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
Lo anote de una
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
:ok_hand:
Thank you!!!!
para escuchar el clik del boton = onClick para escuchar el valor de nuestro input = onChange
sí, básicamente son los mismos eventos de HTML pero se utiliza camelCase en sintaxis JSX
Estos video han de grabarlos tarde en la noche, JuanDC se ve súper emocionado, pero no sube la voz... ¡que buen vecino!
Energía != Volumen :grimacing: . Gran consejo para profes :green_heart:
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
Que fastidio esa voz gritando
Una forma de poder enviar los mensajes tambien:
let onComplete = () => { alert(`Has completado la tarea ${props.text}`) }
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> ); }
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
Hola, tengo una duda con las arrow function, que diferencia entre usar parentesis y llaves o es lo mismo, () => { ... } ----- () => ( ... )
Si usas parentesis indicas que retorna lo que esta dentro del parentesis sin colocar la palabra return y con las llaves es necesario escribir la palabra return.
por ejemplo:
const sum = (a, b) => (a + b); // regresa la suma de a + b const sum = (a, b) => {a + b}; //no regresa nada const sum = (a, b) => {return a + b}; // regresa la suma de a + b
sin el paréntesis significa que el return está implícito y debe estar todo en una misma linea. Con paréntesis puedes agregar varias líneas de código pero debes por obligación debes agregar la palabra return
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
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,namey elvalueactual 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> ); };
Gente a mi no se me auto refresca en navegador cuando cuando guardo. Tengo la version "react-scripts" 5.0.0 de create-react-app y no me funciona. AYUDAAA!!!!
Para los que aun tengan el mismo problema, logré solucionarlo creando el proyecto dentro de una direccion de WSL2. A pesar que tenia WSL2 igual seguia creando mis proyectos en una direccion de windows 😅
Parce!! Juan definitivamente contagia con su forma de ser, es único el chino!! Gracias Profe :)
Como lo veo cada vez que hago un npm start