Manejar el estado es fundamental al desarrollar aplicaciones en React, y como desarrolladores, es vital conocer las diferentes maneras y paradigmas disponibles para hacerlo. En nuestra aplicación ToDoMachine, hemos utilizado estados independientes imperativos mediante React.useState. Sin embargo, llegará el momento en que podamos querer considerar el uso de estados derivados o compuestos para una gestión más eficiente.
¿Qué es un estado derivado y cómo implementarlo?
Un estado derivado se genera a partir de otros estados ya existentes. Esto significa que no se crea de manera independiente usando useState, sino que depende de las propiedades de otros estados para calcular su valor. Por ejemplo, variables como CompletedToDoos o TotalToDoos toman información de los ToDoos que ya existen para calcular sus valores, sin necesidad de definir nuevos estados.
Esto asegura que no creamos estados innecesarios que solo repiten información derivada de otro estado. Sería un error común usar useState de la siguiente manera:
const[totalToDoos, setTotalToDoos]=useState(ToDoos.length);// No recomendado
En lugar de crear un estado independiente, simplemente utiliza variables derivadas, lo que es más eficiente y evita la duplicación de datos.
¿Cómo utilizar correctamente los custom hooks?
Un buen diseño de custom hooks es clave para un desarrollo de React efectivo y eficiente. En nuestro ejemplo, useToDoos es un custom hook que aprovecha otro hook personalizado useLocalStorage para gestionar los estados de localStorage:
Estructura de useToDoos
Trae información almacenada en localStorage.
Usa hooks como useState para manejar estados específicos como SearchValue y OpenModal.
Calcula estados derivados para aspectos como búsqueda de ToDoos.
¿Cuándo considerar el uso de estados compuestos o useReducer?
El uso de estados compuestos permite que distintas partes de tu aplicación compartan el mismo estado de manera eficiente. Esto se puede lograr mediante useReducer, que ofrece una manera más estructurada de manejar estados complejos en React.
Ventajas de useReducer:
Mejor organización del código al agrupar lógica de actualización del estado.
Mayor escalabilidad al manejar estados complejos y múltiples actualizaciones.
Facilita la depuración al centralizar las actualizaciones de estado en una función reductora.
En resumidas cuentas, saber cuándo y cómo implementar estados derivados, custom hooks, y potencialmente useReducer, te lleva a una gestión más limpia y mantenible de tu aplicación React. Te animo a explorar estas posibilidades y evaluar dónde valdría la pena hacer cambios en tu propio código. ¡Sigue aprendiendo y perfeccionando el arte del estado en React!
Variables que no se crean su propio estado pero dependen de un estado anterior
No llaman a React.useState para definir su información
Utilizan la información que ya habíamos guardado antes en otro estado y a partir de ahí algún calculo, cuenta, registro, etc.
Pueden tener la misma convencion de nombres que los estados "normales"
Se actualizan automáticamente con los cambios a los estados "normales".
Se crean a partir de estados normales.
NO SE CREAN USANDO:
React.useState
Lo apunto por si va al examen crack
Para mi es necesario que en cualquier forma de manejar el estado hay que separar los distintos casos de nuestra logica.
Si tenemos por ejemplo un reducer que maneje si se muestre o no un modal y que maneje los todos, es importante evaluar si los pudiesemos separar en dos reducer independientes.
Son variables que dependen del estado.
.
Ejemplo de estado derivado:
const[allItem, setItem]=React.useState(initialValue);// Estado imperativoconst item = allItem.filter(todo=>(!todo.deleted));// Estado derivado// Estado derivadoconstsaveItem=(newItem)=>{try{const stringifiedTodos =JSON.stringify(newItem);localStorage.setItem(itemName, stringifiedTodos);setItem(newItem);}catch(error){setError(error);}}
Si no les corre el programa al dar npm start, y les sale el siguiente error: Error message "error:0308010C:digital envelope routines::unsupported" , deben correr el siguiente comando en la terminal:
exportNODE_OPTIONS=--openssl-legacy-provider
Gracias, me sirvió mucho
excelente, muchas gracias !
Creo que para manejar el estado en cualquier componente o con React Hooks debemos considerar varios factores con respecto a que queremos en el futuro en nuestro código.
En el TodoForm creamos estados independientes porque solo los necesitamos ahí por ahora. Me parece que podemos pensar en algo más declarativo si queremos que la aplicación crezca o si sabemos que en futuras funcionalidades necesitaremos compartir esos estados.
Creo que es importante considerar el futuro de la aplicación, si otras personas trabajaran en el equipo, como vamos a hacer la documentación, etc. El código declarativo me parece que ayuda sobre todo a los programadores que seguirán trabajando en el código, porque la idea es que al funcionalidad para el usuario se mantenga.
Si usan la versión 18 de node deben bajarla a la 16 para que les funciones.
Yo utilice el siguiente comando en la consola del proyecto:
exportNODE_OPTIONS=--openssl-legacy-provider
Despues volví a correr el npm start y todo funcionó correctamente
PLATZI actualizó la APP y ahora es mas dificil manejarla y los recursos de la clase que citan los profes no salen ya. Creo que se debe actualizar para mejorar la experiencia del usuario.
¿Que pasa PLATZITEAM?
En mi código, el searchedTodos quedo diferente al del profesor:
.
Vamos a revisar nuestra aplicación TodoMachine y averiguar que paradigmas estamos utilizando, es decir estados imperativos, independientes con React.useState. Vamos a ver dónde puede valer la pena que cambiemos eso o dónde no, y averiguar las razones detrás de estas decisiones.
.
Vamos a repasar el concepto de estados derivados, es decir estados que no se crean por si solos, sino que se crean a partir de los estados que ya hayamos creado antes.
.
Nuestro componente raíz es index.js en la carpeta src, este renderiza a nuestro componente App en el nodo con id root que se encuentra en el index.html que se encuentra en la carpeta public.
.
<body><noscript>You need to enable JavaScript to run this app.</noscript><divid="root"></div><divid="modal"></div></body>
.
En primeras instancias, si analizamos el componente App nos daremos cuenta que el custom hook useTodos que estamos utilizando nos trae demasiada información.
.
.
A su vez este custom hook internamente hace uso de otro custom hook llamado useLocalStorage. Es decir, parte de la información de useTodos la trae este otro custom hook pero la devolvemos con otros nombres.
.
.
Aparte del custom hook encontramos también estados creados por useState, sin embargo lo que nos interesa son los estados que encontramos inmediatamente después, como ser completedTodos, totalTodos y searchedTodos. Estos son variables que tomarán el nombre de estados derivados,los cuales no crean su propio estado, sino que utilizan la información creada anteriormente en otros estados y a partir de allí hacen algún cambio.
.
Un error común sería crear estos estados mediante useState y decir que su estado inicial es un estado independiente a su vez.
.
const totalTodos =useState(todos.length);
.
Los estados derivados no tienen que ser nuevos estados, sino que simplemente tienen que ser variables que dependen del estado.
.
Finalmente, tenemos al custom hook useLocalStorage que hace uso de varios estados independientes y retorna un objeto, puesto que son más de 2 elementos, en tal caso hubiese sido mejor devolver un array con su estado y actualizador.
.
El objetivo es ver como se vería dicho custom hook haciendo uso de useReducer.
.
.
Otro lugar donde utilizamos un estado independiente de forma imperativa es el componente TodoForm. En este caso es el único lugar donde se utiliza este estado.
.
.
Es nuestra responsabilidad discernir donde es conveniente utilizar estados independientes e imperativos con React.useState, estados compuestos y React.useReducer.
No me gusto la clase, porque de un momento a otro trajeron otra app que no armamos desde cero y nos confundimos, si la agregan que sea desde cero para tenerla también como proyecto...
Antes de tomar este curso habia que tomar el curso de patrones y render en React donde se ve este proyecto.
no mira que en ese curso de allá tampoco esta el proyecto, como Juan David menciona el proyecto está en el curso de introducción a React, y ya el curso de él lo quitaron, por eso quedamos algo confundidos
A alguien mas le paso que su version de TodoMachine el codigo no se parece en nada a la que te muestra el profesor, siento que en algun momento cambio el codigo de la App y el repositorio que aqui nos proponen tiene bastante diferencias.
Me gusto mucho la explicacion pero siento que considerarla en partes mas tempranas del curso facilitaria la comprension