Estado Local en React: Uso de useState para Contadores
Clase 4 de 24 • Curso de React.js
Contenido del curso
Clase 4 de 24 • Curso de React.js
Contenido del curso
Jose Luis Bedoya
Alfonso Neil Jiménez Casallas
Platzi Team
Kevin Diaz Moya
Eduardo Razo Cobián
Brayan Stiven Muñoz Masias
Fernando Andres Carreño Rodriguez
Arturo Galvis
Axel Enrique Galeed Gutierrez
Christian Camilo Guantiva Figueroa
Maryoris Zamora
Israel Medina Arroyave
Cristian Florez
Jeremy Orellana
Raúl Adolfo Sánchez Rodríguez
Paula Andrea Beltrán Salazar
Stephania Millán
Johan Alexander Rojas Suarez
Yan Harold Muñoz Dominguez
Axel Enrique Galeed Gutierrez
Daniel Eduardo Lara Hayek
Noelieth Mariana Lanza Longart
Michell García Ibarra
Pablo Andres Fernandez Cari
Diego Frank Lipa Choque
Cesar González Caballero
Héctor Avilés
Exportar componentes con export NombreComponente en lugar de export default NombreComponente mejora la claridad y consistencia del código, ya que siempre se usa el mismo nombre al importarlo, evitando confusiones. Además, facilita la refactorización y el autocompletado en editores como VSCode.
Con el export default puedes renombrar el componente y causar problemas
interesante observación
Interesante, tiempo que no desarrollaba y no me habia dado cuenta
Un pequeño aporte para esas personas que les gusta ir un poco mas alla... Les motivo a todos a agregar una pequeña funcionalidad a su codigo, les propongo hacer que cuando el contador actual llegue a cero el boton de decrementar se desactive y asi no llegar a numeros negativos... Es algo avanzado a la clase, pero de esta forma se motivan a seguir indagando mas.... <u>Si necesitan aca esta mi codigo con su funcionalidad agregada...</u>
import { useState } from "react"; const Counter = () => { const [count, setCount] = useState(0); return( <section> <h2>Contador</h2> <p>El estado actual es: {count}</p> <button onClick={() => setCount(count + 1)}>Incrementar</button> { count <= 0 ? <button disabled>Decrementar</button> : <button onClick={() => setCount(count - 1)}>Decrementar</button> } </section> ) } export default Counter; ```import { useState } from "react"; const Counter = () => {const \[count, setCount] = useState(0); return( \<section> \<h2>Contador\</h2> \<p>El estado actual es: {count}\</p> \<button onClick={() => setCount(count + 1)}>Incrementar\</button> { count <= 0 ? \<button disabled>Decrementar\</button> : \<button onClick={() => setCount(count - 1)}>Decrementar\</button> } \</section> )} export default Counter;
Mi ejemplo:
import { useState } from "react"; const Counter = () => { const [count, setCount] = useState(0); return ( <> <p>El contador está en : {count} </p> <button onClick={() => setCount(count + 1)}>+</button> <button onClick={() => setCount(count - 1)} disabled={count <= 0}>-</button> </> ) } export default Counter; ```import { useState } from "react"; const Counter = () => { const \[count, setCount] = useState(0); return ( <> \<p>El contador está en : {count} \</p> \<button onClick={() => setCount(count + 1)}>+\</button> \<button onClick={() => setCount(count - 1)} disabled={count <= 0}>-\</button> \</> )} export default Counter;
Dentro del mismo boton puedes decirle que se desabilite
disabled={count=== 1} o menor igual
Hola Devs, les traigo una guía paso a paso con ejemplos para dominar useState, el Hook más usado en React. 🚀
Ocurre que el useState tambien sirbe para evitar renderizar todo la pantalla y solo se renderize el estado de la variable lo que ahce mas eficiente el suo de maquina y respeusta al cliente.
La clase está muy buena, solo me gustaría aportar un pequeño detalle sobre la forma de actualizar el estado.
En el video, la profe utiliza la forma directa: setCount(count - 1). Esta funciona bien en muchos casos simples, pero puede generar problemas cuando hay múltiples actualizaciones en lote o asincrónicas, ya que podría no tomar el valor más reciente del estado.
Para evitar este tipo de inconvenientes, es recomendable usar la forma funcional del setter que nos ofrece useState. Esta forma garantiza que siempre trabajamos con el valor más actualizado del estado. El código quedaría así:
setCount(prev => prev - 1)
prev hace referencia al valor actual de nuestro estado, en nuestro caso count.
De esta manera, nos aseguramos de que las actualizaciones al estado sean consistentes, incluso en escenarios más complejos. 😁
Esta lección yo la he visto trabajar o mejor dicho es muy util en carritos de compra.
Le agregue un boto que permita resetear el contador e iniciar nuevamente en 0
Like quien haya detectado el: TRACA!!☺️
En febrero de este año (2025) depreciaron Create React App
ahora que alternativa nos queda ?
Si vas a actualizar un estado basándote en su valor anterior, es recomendable usar una función dentro del actualizador del estado, especialmente cuando se realizan varias actualizaciones dentro del mismo evento.
Esto garantiza que siempre se utilice el valor más reciente del estado y evita errores causados por actualizaciones agrupadas o desfasadas. Aun así, React garantiza que, ante acciones del usuario como clicks o eventos similares, el estado se actualizará y se reflejará correctamente antes de manejar el siguiente evento del usuario.
🚩Mira esta saga de carruseles y aprende un poco más sobre REAC JS:
useState podría usarse para switch (on/off), una alarma, temporizador; para un sistema de inventario (quizás?); para un botón visible/no visible, saldo en tu cuenta, contraseña.
Hola chicos, en el QUIZ anterior creo que hay un pequeño bugcito. A veces la pregunta de reutilizar un componente sale erronea. pero luego sale OK al repetir el Quiz. Esto por si les pasa.
Así quedo mi pequeño componente con mi amado Bootstrap
Estado
Podemos tener la cantidad de estados que queramos, para los diferentes datos o información que van a cambiar por la interacción de los usuarios.
El estado en React es imputable, esto implica que no podemos cambiarlo como si de una variable se tratase, tenemos que actualizarlo por medio de una función actualizadora del estado que tiene que ser controlada por React.js.
Ejemplo
Sin estado
Tenemos el siguiente código que, en teoria, va sumando n a medida que le vamos dando clic al botón Click.
Al dar clic al botón la variable se va a actualizar, pero nuestro elemento p no se enteró de que nuestra n se ha actualizado.
let n = 0; export function TodoClick(): JSX.Element {   return (   <>   \<p>Diste click {n} veces\</p>   \<button   onClick={() => {   n++;   }}   \>   Click   \</button>   \</>   ); }
Con estado
Creamos un estado con useState cuyo valor por defecto va a ser 0, el nombre de ese estado es state y la función encargada de actualizar ese estado es setState.
Ahora dentro del onClick vamos a llamar el actualizador del estado y envié, cuando se dé clic, se debe de sumar uno al estado.
export function TodoClick(): JSX.Element { 	const \[state, setState] = useState(0); 	return ( 	 <> 	 \<p>Diste click {state} veces\</p> 	 \<button 	 onClick={() => { 	 setState((prevState) => prevState + 1); 	 }} 	 \> 	 Click 	 \</button> 	 \</> 	); }
Renderizado
Cada vez que llamamos un actualizador del estado o cambiamos el estado de un componente, el componente se vuelve a renderizar. Se llama a la fábrica de render de React.js y se pide que se actualice el componente.
Fábrica de render
Se envía los componentes (con sus respectivos elementos, propiedades y ahora estados) a la fábrica de render, este los procesa y cuyo procesamiento nos da como resultado HTML y JavaScript.
Como ahora tenemos estado podemos disparar eventos en nuestro navegador y eso va a ser que “nuestro guardián del estado” le va a avisar a nuestra “fábrica de estado” sobre que hubo un cambio en el estado. Se va a indicar cuál componente fue el que se actualizó, por ende va a tener que volver a pasar por la “fábrica” para poder renderizarse y volver a tener su información actualizada.
Virtual DOM
React.js crea una copia del DOM y esta copia cada vez que se cambia el estado y tiene que volver a renderizar algún componente, se aplican primero los cambios a este DOM virtual y hay algo que cambió, recién ahí es donde lo aplica al DOM del navegador.
Esto permite que React.js no tenga que renderizar siempre, sino que solamente lo hace en aquellos que hayan cambiado.
Cual es las ventajas de usar React con Vite y no con next.js como aparece en la documentación oficial ?
Usar React con Vite en lugar de Next.js ofrece unamayor flexibilidad y control sobre la configuración del proyecto, así como una velocidad de desarrollo más rápida. Next.js, por otro lado, proporciona un framework con características predefinidas como el renderizado en servidor, optimización de imágenes y un flujo de desarrollo simplificado, lo que puede ser beneficioso para proyectos que requieren esas características.
Aquí otra forma de deshabilitar el botón de decrementar cuando el contador llega a 0, utilizando el mismo state count:
import { useState } from "react"; const Counter = () => { const [count, setCount] = useState(0); return ( <> <div style={{display: 'flex', gap: '20px'}}> <button onClick={() => setCount(count - 1)} disabled={count <= 0} >Decrementar</button> <p>El contador está en {count}</p> <button onClick={() => setCount(count + 1)}>Incrementar</button> </div> </> ); } export { Counter } ```import { useState } from "react"; const Counter = () => {   const \[count, setCount] = useState(0);   return ( <> \<div style={{display: 'flex', gap: '20px'}}> \<button onClick={() => setCount(count - 1)} disabled={count <= 0} >Decrementar\</button>   \<p>El contador está en {count}\</p>   \<button onClick={() => setCount(count + 1)}>Incrementar\</button> \</div> \</> );} export { Counter }
Aprecio mucho que la clase vaya directo al grano, mostrando lo que es importante. Algo positivo es que da lugar a que uno investigue por su cuenta y también que otros estudiantes puedan subir tutoriales sencillos
el hook useStare lo relaciono con of o reactive de vuejs
Cuando generas un componente es mejor crearlo con una funcion normal y no una de flecha, para crear funciones puedes usar función de flecha *
¿?