No tienes acceso a esta clase

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

No se trata de lo que quieres comprar, sino de quién quieres ser. Aprovecha el precio especial.

Antes: $249

Currency
$209

Paga en 4 cuotas sin intereses

Paga en 4 cuotas sin intereses
Suscríbete

Termina en:

14 Días
11 Hrs
20 Min
42 Seg
Curso de React.js

Curso de React.js

Juan David Castro Gallego

Juan David Castro Gallego

Custom Hooks

14/34
Recursos

Aportes 39

Preguntas 8

Ordenar por:

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

Siento que es una explicacion de como hiciste la aplicacion en vez de enfocarse en los conceptos y usos de react. creo que varias de las clases van enfocadas a la app TODOs y no a react como tal. asi va hasta ahora para mi. espero que no sea asi para todos.

🔵Evita las dependencias dentro de tus componentes con Custom Hooks

Cuando estás utilizando paquetes dentro de React, por ejemplo, el paquete inventado QueryPlatzi, evita importarlo en cada componente, a menos que sea necesario.

import { useQueryPlatzi } from 'query-platzi'

function Component () {	
	const query = useQueryPlatzi()
	
	return ...
}

.
En su lugar, crea un custom Hook para abstraer la funcionalidad del paquete.
.

// archivo-> hooks/useQueryApp.js
import { useQueryPlatzi } from 'query-platzi'

export function useQueryApp () {	
	return useQueryPlatzi
}

.
Aunque parezca algo insignificante, es realmente poderoso, ya que, si en un futuro necesitas cambiar el paquete QueryPlatzi por otro, solo lo harás en un solo sitio. De esta forma el componente se mantiene lo más declarativo posible.
.

import { useQueryApp } from '@hooks/useQueryApp'

function Component () {	
	const query = useQueryApp() 
	//Solo realizo una función, utilizar la query
	
	return ...
}

.
Finalmente, según la documentación de React, si observas un useEffect muy usado o con mucha lógica, lo más seguro es que puedas abstraerlo en un custom Hook.
.
Fuente: Reutilización de lógica utlizando Hooks personalizados

HOOKS

Los hooks son funciones que puedes llamar dentro de componentes funcionales para agregar y manipular características de React, como el estado, el ciclo de vida y los efectos secundarios. Los hooks más comunes son useState, useEffect y useContext, pero también puedes crear tus propios hooks personalizados.

Los Hooks son más restrictivos que las funciones regulares. Solo puedes llamar a los Hooks en el primer nivel de tus componentes (u otros Hooks). Si quisieras utilizar useState en una condicional o en un bucle, extrae un nuevo componente y ponlo ahí.

CUSTOM HOOKS

React viene con varios Hooks integrados como useState, useContext y useEffect. A veces, desearás que haya un Hook para algún propósito más específico: por ejemplo, para obtener datos, para mantener un seguimiento de si un usuario está conectado o para conectarse a una sala de chat. Es posible que no encuentres estos Hooks en React, pero puedes crear tus propios Hooks para las necesidades de tu aplicación.

  • Permite: compartir logica entre componentes y tener el codigo del componente como tal mucho mas limpio
  • Al abstraer usando Hooks nos facilita la lectura del codigo, teniendo las partes que le competen al componente en una seccion y las partes de la funcionalidad del hook en otra diferente.
  • Cuando vale la pena implementarlo? Bajo nuestro criterio cuando veamos necesario abstraer una logica.

Comprendo la utilidad de Custom Hooks para encapsular codigo y hacer más legible nuestra app…
.
Pero me resulto super enredado y confuso, sobre que parámetros pasar, como pasarlos y demás…
Espero que con practica lo entienda mas fácilmente!

Un pequeño detalle con los Hooks personalizados que estoy casi seguro mencionó Juan David pero que me parece que es muy necesario recordar, cuando exportamos los valores que queramos de nuestro Hook si lo hacemo como un array[] podremos al momento de ejecutar el hook dentro del componente renombrar los valores que vienen, sin embargo también se pueden exportar en un objeto{} sin embargo eso le quita dinamismo que en el caso de nuestro Hook para manipular localStorage no sería idóneo ya que si por ejemplo queremos persistir el estado de un usuario que hizo login por ejemplo tendríamos que hacerlo siempre con el nombre de la variable item como se exporto (si se hubiese exportado como objeto y no como array) .
Es por eso que al exportarlo como Array y permitir renombrar los elementos podemos hacerlo coincidir más explícitamente lo que estamos guardando en localStorage.
Tal vez sea un comentario muy resbucado pero de verdad esa pequeña diferencia puede hacer un gran cambio en como entendemos la lógica de negocio de nuestros componentes.

No se si soy solamente yo al que le pasa, pero el uso de los custom hooks es para extraer funcionalidades y mantener nuestros componentes más simplificados, pero siento que no es el caso en esta explicación, siento que quedo mas enredado que antes, 🙁😕 No puedo entenderlo bien.

Consejo sano: Ahora que estamos pasando el itemName como un argumento en el localStorage, verifiquen que esten enviando el nombre bien. No sean como yo que envio otro y estuve buscando el bug por 30 minutos 😒🤘

Los Hooks te permiten agregar y manejar el estado en componentes funcionales, lo cual antes solo era posible en componentes de clase utilizando el estado del constructor y los métodos del ciclo de vida. Con los Hooks, puedes usar el estado en componentes funcionales sin necesidad de convertirlos en componentes de clase.

Algunos de los Hooks más comunes en React son:

useState: Permite agregar y actualizar el estado en componentes funcionales. Recibe un valor inicial y devuelve un array con dos elementos: el estado actual y una función para actualizarlo.

useEffect: Permite ejecutar efectos secundarios en componentes funcionales. Puedes usarlo para realizar tareas como hacer llamadas a API, suscribirte a eventos o limpiar recursos. Se ejecuta después de que el componente se haya renderizado.

useContext: Permite acceder al contexto de React en componentes funcionales. Te da acceso al valor actual del contexto definido en un componente superior utilizando el componente Context.Provider.

useRef: Permite mantener una referencia mutable en componentes funcionales. Puede ser útil para acceder directamente a un elemento del DOM o para almacenar valores que persisten a través de re-renderizados.

Ahora, los Custom Hooks son funciones que te permiten reutilizar lógica entre componentes. Son funciones personalizadas que pueden contener uno o varios Hooks de React, además de lógica adicional específica para tu aplicación. Puedes crear tus propios Custom Hooks para encapsular la lógica común y reutilizarla en diferentes componentes.

Un Custom Hook es simplemente una función que empieza con el prefijo “use” y puede utilizar cualquier Hook de React. Puedes crear Custom Hooks para manejar tareas específicas, como la autenticación, el manejo de formularios o la gestión de datos. Esto te permite mantener tu código más modular, legible y reutilizable.

Por ejemplo, podrías crear un Custom Hook llamado useFetch que encapsule la lógica de realizar una llamada a una API y manejar el estado de carga y respuesta. Luego, puedes reutilizar este Custom Hook en diferentes componentes para realizar solicitudes de API de manera consistente.

Recuerda que los Hooks deben seguir ciertas reglas de uso, como solo ser llamados en el nivel superior de un componente de función y no dentro de bucles, condiciones o funciones anidadas.

Espero que esta explicación te haya ayudado a comprender los conceptos de Hooks y Custom Hooks en React. Si tienes alguna pregunta adicional, ¡estaré encantado de ayudarte!

La gracia de los hooks es encapsular y abstraer en un archivo, no dejarlo en el mismo 😅, F

## Mejora de la Persistencia de Datos en ReactJS con Local Storage * En la clase anterior, implementamos la persistencia de datos en nuestra aplicación usando Local Storage. * Esto permitió que los usuarios pudieran recargar la página sin perder los cambios realizados. ## Complejidad del Componente App * El componente App ahora es más complejo debido a la lógica adicional para manejar la persistencia de datos con Local Storage. * La lógica para guardar el estado de los todos y la persistencia de datos está mezclada, lo que aumenta las líneas de código y la complejidad. ## Uso de Custom Hooks en ReactJS * Para limpiar y reutilizar la lógica de la persistencia de datos, vamos a utilizar una herramienta de ReactJS llamada Custom Hooks. * Los Custom Hooks permiten abstraer partes de la lógica de los componentes, haciéndolos más limpios y reutilizables. * Seguimos la convención de ReactJS de nombrar los Custom Hooks con el prefijo "use", por ejemplo, useLocalStorage. ## Implementación de useLocalStorage * La idea es crear una función llamada useLocalStorage que maneje todo lo relacionado con Local Storage. * Esta función se encargará de la lógica para leer y escribir en Local Storage, eliminando cualquier referencia directa a Local Storage en el componente App. * Definiremos un estado dentro del Custom Hook que representará los datos almacenados en Local Storage. ## Creación del Estado y Funciones en useLocalStorage * Dentro del Custom Hook, crearemos un estado usando react.useState para manejar el ítem almacenado en Local Storage. * La función saveItem se encargará de actualizar tanto el estado interno del Custom Hook como Local Storage. * El Custom Hook recibirá dos parámetros: el nombre del ítem en Local Storage (itemName) y el valor inicial (initialValue). ## Retorno de Estado y Funciones desde useLocalStorage * El Custom Hook retornará un array con el estado (item) y la función para actualizarlo (saveItem). * Esto permitirá que el componente App consuma el estado y la función de actualización sin interactuar directamente con Local Storage. ## Uso de useLocalStorage en el Componente App * En el componente App, reemplazamos el uso de react.useState con el Custom Hook useLocalStorage. * Pasamos el nombre del ítem y el valor inicial al Custom Hook. * El componente App ahora solo maneja la lógica relacionada con los todos, sin preocuparse por Local Storage. ## Prueba de Funcionamiento * Recargamos la aplicación para verificar que la lógica de persistencia de datos sigue funcionando correctamente. * Completamos y eliminamos tareas para asegurar que el estado local de React y Local Storage se actualizan correctamente. * La aplicación mantiene su funcionalidad para los usuarios, mientras que la legibilidad y mantenibilidad del código mejoran para los desarrolladores. ## Consideraciones sobre el Uso de Custom Hooks * Decidir cuándo implementar Custom Hooks depende del criterio y la experiencia del desarrollador. * La abstracción de lógica compleja en Custom Hooks puede facilitar el mantenimiento y la legibilidad del código. * La práctica y la experimentación son esenciales para desarrollar un buen criterio sobre cuándo y cómo usar Custom Hooks. ## Próximos Pasos * En la próxima clase, continuaremos mejorando la organización y legibilidad de nuestra aplicación. * Aprenderemos a trabajar con archivos y carpetas en ReactJS. * Mientras tanto, sigue practicando y explorando más sobre Custom Hooks y su uso en diferentes proyectos de ReactJS.

Necesito una explicacion mas conceptual ):

HELLO!! 😎
Me pareció una clase muy interesante, la verdad entendí gran parte de esta clase y deban saber que si bien el profe hablo mucho de mover lógica y código y de nuestra aplicación TODO’s podría ser cualquier otra App,debemos pensar como programadores y que esto de los Custom Hooks es más común en entrevistas de react ya que permite saber como manejas tu código/ lógica, y lo que todas las empresas quieren es que el código que hagas sea escalable y reutilizable en el tiempo, que cuando se necesite hacer otra aplicación o algún cambio en nuestra app TODO’s solo cambiemos cierta parte del código, pero no toda la lógica, ya que esta debe persistir en el tiempo. Si llegas hacer un custom hook en una entrevista de trabajo seguro que será un plus muy importante ya que es una de las muchas cosas que nos permite hacer React, no soy muy avanzado en React apenas estoy empezando pero creo que esta clase por mas confusa que parezca es muy importante que entendamos.

🟨 Raza! No se estresen como yo jaja en no saber los custom hooks recordemos que es a nuestro criterio cuando usarlos, ademas si son algo complicados los custom hooks, digo no por algo tiene su propio curso!
Exito amigos!

Si estan usando React Vite + Typescript como yo los abstraje de la siguiente manera: `useLocalStorage.ts`: Se define el tipo \<T,> como propiedad para indicarle que puede ser cualquier cosa ,ya que Any no esta permitido ```js const useLocalStorage = <T,>(itemName: string, initialValue: T) => { const localStorageItem: string | null = localStorage.getItem(itemName); const initialItem: T = localStorageItem ? (JSON.parse(localStorageItem) as T) : initialValue; const [item, setItem] = useState<T>(initialItem); const saveItem = (newItem: T) => { localStorage.setItem(itemName, JSON.stringify(newItem)); setItem(newItem); }; return [item, saveItem] as const; }; ```interface IToDos {    text:string,    completed:boolean,}`App.tsx`: se envi el valor inicial como un Arreglo de la interface IToDos ```js const [toDos, handleSaveToDos] = useLocalStorage('TODOS_V1', [] as IToDos[]) ```IToDos.ts: es la interface que define el objeto ```js interface IToDos { text:string, completed:boolean, } ```

Este es mi custom hook para trabajar con localStorage:

function useLocalStorage(itemName, initialValue) {
  const [itemsList, setItemsList] = useState(
    () => JSON.parse(localStorage.getItem(itemName)) || initialValue
  );

  const saveLocalStorage = (actualizedList) => {
    setItemsList(actualizedList);
    let tasksListString = JSON.stringify(actualizedList);
    localStorage.setItem(itemName, tasksListString);
  };

  return [itemsList, saveLocalStorage];
}

Profe o los que ya dominen React…dejen en comentarios como uno aprende toda la lógica de una nueva tecnología como por ejemplo React…siento que aprendo pero luego se me olvida.

Hola a todos, estuvo interesante ese custom hook, pero como dicen algunos comentarios, le falta algo de escalabilidad, hice algo para poder crear una variable de una forma más global:

Lo siento, estoy haciendo esto con TypeScript también

src/hooks/LocalStorageHook.tsx

import { useState } from "react"

import { valueToString, valueTransform } from "../utils/valueConversion";

export const useLocalStorage = (localStorageItemName: string, initialValue: any ) => {
    const [localStorageInfo, setLocalStorageInfo] = useState(initialValue);
    const localStorageValue: string | null = localStorage.getItem(localStorageItemName)
    if (localStorageValue) {
        const convertedLocalStorage = valueTransform(localStorageValue)
        setLocalStorageInfo(convertedLocalStorage)
    } else {
        const localStorageValue:string = valueToString(initialValue)
        localStorage.setItem(localStorageItemName, localStorageValue)
        setLocalStorageInfo(initialValue)
    }

    const saveLocalStorageInfo = (newItem:any) => {
        localStorage.setItem(localStorageItemName, valueToString(newItem))
    }

    return [localStorageInfo, saveLocalStorageInfo]
}

src/utils/valueConversion.ts

export const valueToString = (value:any) => ((typeof(value) === "object") ? JSON.stringify(value) : String(value))

export const valueTransform = (value:string) => {
    try {        
        return JSON.parse(value)
    }
    catch { 
        return value
    }
}
**CUSTOM HOOKS** *Los **Custom Hooks** en* **React.js** *son **funciones reutilizables** que **encapsulan** **lógica** de **estado** y **efectos** para ser **compartidas entre diferentes componentes**. Permiten **abstraer** y **organizar** el **código** de manera **eficiente**, **aprovechando** las **capacidades** de los **hooks** **estándar** como* **useState***,* **useEffect***,* **useContext***, **entre** **otros**. Los **Custom** **Hooks** se **nombran** **siguiendo** la **convención*** **use** *al **inicio** del **nombre*** (por ejemplo, useFetch)*, y pueden **aceptar parámetros** y **devolver valores** que **encapsulan lógica compleja**, **mejorando** la **legibilidad** y **mantenibilidad** del **código**. Al **centralizar** la **lógica** **compartida**, los **Custom Hooks promueven** la **reutilización** de **código** y **facilitan** las **pruebas** **unitarias** y el **mantenimiento** del **proyecto**.*
No entendí nada esta clase, voy a tener que repasar bien los conceptos
Sin duda, se que hay tipos de aprendizajes, pero en mi caso me siento más cómodo aprendiendo conforme práctico. Aunque no siempre pueda retener el 100% de la información, por lo menos soy consciente de la finalidad práctica de un concepto.
Como va mi TODO Machine hasta ahora ![](https://static.platzi.com/media/user_upload/Captura%20de%20pantalla%202024-02-01%20183411-eefedd4a-9fc8-4b99-a772-ae4ae9798621.jpg)
Me parece excelente q se enfoque en la creacion de la app para que vamos entendiendo y deduciendo lo conceptual de cada tema de react. Me parece que es la forma con la que mejor comprendo y he tomado un curso diferente que era muy teorico pero era muy pesado y no se comprende facilmente mientras que de esta manera me queda mas facil y voy a la par creando y aprendiendo. Me gusta mucho la metodologia de Juan.
No me funciona el codigo, alguien me ayuda porfa, no me quiere mostrar nada en pantalla se queda en fondo y ya no hace nada: ```jsx function useLocalStorage(itemName, initialValue) { const localStorageItem = localStorage.getItem(itemName); let parsedItems; if (!localStorageItem) { localStorage.setItem(itemName, JSON.stringify(initialValue)); parsedItems = []; } else { parsedItems = JSON.parse(localStorageItem); } const [item, setItem ] = React.useState(); const saveItem = (newItem) => { localStorage.setItem(itemName, JSON.stringify(newItem)); saveItem(newItem); }; return [item, saveItem] } function App() { const [todos, saveTodos] = useLocalStorage('TODOS_V1', []); const [searchValue, setSearchValue] = React.useState(''); const completedTodos = todos.filter(todo => !!todo.completed).length; const totalTodos = todos.length; const SearchedTodos = todos.filter((todo) => { // función texto sin tildes const noTildes = (text) => { return text.normalize("NFD").replace(/[\u0300-\u036f]/g, ""); }; // Normalizando texto sin tildes y a Lower Case const TodoTextLC = noTildes(todo.text.toLowerCase()); const searchTextLC = noTildes(searchValue.toLowerCase()); return todo.text.toLowerCase().includes(searchValue.toLowerCase()); }); const completeTodo = (text) => { const newTodos = [...todos]; const todoIndex = newTodos.findIndex((todo) => todo.text == text); newTodos[todoIndex].completed = true; saveTodos(newTodos); }; const deleteTodo = (text) => { const newTodos = [...todos]; const todoIndex = newTodos.findIndex((todo) => todo.text == text); newTodos.splice(todoIndex, 1); saveTodos(newTodos); }; return ( <React.Fragment> <TodoCounter completed={completedTodos} total={totalTodos} /> <TodoSearch searchValue={searchValue} setSearchValue={setSearchValue} /> <TodoList> {SearchedTodos.map((todo) => ( <TodoItem key={todo.text} text={todo.text} completed={todo.completed} onComplete={() => completeTodo(todo.text)} onDelete={() => deleteTodo(todo.text)} /> ))} </TodoList> <CreateTodoButton /> </React.Fragment> ); } export default App; ```function useLocalStorage(*itemName*, *initialValue*) {   const localStorageItem = localStorage.getItem(*itemName*);   let parsedItems;    if (!localStorageItem) {    localStorage.setItem(*itemName*, JSON.stringify(*initialValue*));    parsedItems = \[];  } else {    parsedItems = JSON.parse(localStorageItem);  }   const \[item, setItem ] = React.useState();   const saveItem = (*newItem*) => {    localStorage.setItem(*itemName*, JSON.stringify(*newItem*));        saveItem(*newItem*);  };   return \[item, saveItem] } function App() {  const \[todos, saveTodos] = useLocalStorage('TODOS\_V1', \[]); const \[searchValue, setSearchValue] = React.useState('');  const completedTodos = todos.filter(*todo* => !!*todo*.completed).length; const totalTodos = todos.length;    const SearchedTodos = todos.filter((*todo*) => {    *// función texto sin tildes*    const noTildes = (*text*) => {      return *text*.normalize("NFD").replace(/\[\u0300-\u036f]/g, "");    };    *// Normalizando texto sin tildes y a Lower Case*    const TodoTextLC = noTildes(*todo*.text.toLowerCase());    const searchTextLC = noTildes(searchValue.toLowerCase());     return *todo*.text.toLowerCase().includes(searchValue.toLowerCase());  });   const completeTodo = (*text*) => {    const newTodos = \[...todos];    const todoIndex = newTodos.findIndex((*todo*) => *todo*.text == *text*);    newTodos\[todoIndex].completed = true;    saveTodos(newTodos);  };  const deleteTodo = (*text*) => {    const newTodos = \[...todos];    const todoIndex = newTodos.findIndex((*todo*) => *todo*.text == *text*);    newTodos.splice(todoIndex, 1);    saveTodos(newTodos);  };   return (    \<React.Fragment>      \<TodoCounter *completed*={completedTodos} *total*={totalTodos} />      \<TodoSearch *searchValue*={searchValue} *setSearchValue*={setSearchValue} />       \<TodoList>        {SearchedTodos.map((*todo*) => (          \<TodoItem            *key*={*todo*.text}            *text*={*todo*.text}            *completed*={*todo*.completed}            *onComplete*={() => completeTodo(*todo*.text)}            *onDelete*={() => deleteTodo(*todo*.text)}          />        ))}      \</TodoList>       \<CreateTodoButton />    \</React.Fragment>  );} export default App;
Aprendí que puedo usar con un hook y que la otra lógica, pueden ser usada únicamente utilizando esa variable y ser llamada sincrear otro State.

Me acabo de dar cuenta que hasta el final de esta seccion del curso es que se hace la creacion de TODO’s y el manejo del modal, y yo por desesperado lo hice desde hace dos clases.
Seguramente me tocara borrar y cambiar codigo para hacerlo mas eficiente.
La paciencia realmente es una virtud

esta bastante interesante el curso pero creo que deberia ser mas conceptual a este tema

Hola a todos, espero se encuentren genial!!
.
Hace unos días publiqué una duda que tenia acerca del customHook de localStorage y crei viable tratar de crear una solución diferente debido a que segun lo que entiendo en este caso si dejamos localStorage tal cual como la clase ya no podríamos usarlo para otras cosas solo para guardar todos.
.
Entonces modifique algunas cosas y en vez de usarlo como customHook lo use como una fucnion normal, les comparto el codigo para que me den retroalimentación si es una buena idea hacer la solución que hice o si estoy haciendo algo mal.
.
Cabe aclarar que realice la app algo diferente a la del curso.
.
Se aceptan todo tipo de criticas constructivas!! 😃
.
Codigo de LocalStorage

function setLocalStorage(itemName, itemData) {
    localStorage.setItem(itemName, JSON.stringify(itemData));
}

function getLocalStorage(itemName) {
    let localStorageItem = JSON.parse(localStorage.getItem(itemName));
    
    if(!localStorageItem) {
        return false;
    }else {
        return localStorageItem;
    }
}

export { 
    setLocalStorage,
    getLocalStorage
}

Codigo de App

// React State used for DEFAULT TODOS
  const defaultTodos = getLocalStorage('TODO_APP') || [];
  const [todos, setTodos] = React.useState(defaultTodos);

  const saveTodos = (updatedTodos) => {
    setTodos(updatedTodos);
    setLocalStorage('TODO_APP', updatedTodos);
  }

  // React State used for input in TodoSearch Component
  const [searchValue, setSearchValue] = React.useState('');

  // Derivative States
  const completedTodos = todos.filter(todo => todo.completed).length;
  const totalTodos = todos.length;

  const todosSearched = todos.filter(
    (todo) => {
      const todoText = todo.text.toLowerCase();
      const searchText = searchValue.toLowerCase();

      return todoText.includes(searchText);
    }
  );

  const toggleTodoComplete = (todoId, completed) => {
    const updatedTodos = [...todos];
    const todoItemIndex = updatedTodos.findIndex(todoItem => todoItem.id === todoId);
    
    updatedTodos[todoItemIndex].completed = completed;
    saveTodos(updatedTodos);
  }

  const deleteTodo = (todoId) => {
    const updatedTodos = [...todos];
    const todoItemIndex = updatedTodos.findIndex(todoItem => todoItem.id === todoId);

    updatedTodos.splice(todoItemIndex, 1);
    saveTodos(updatedTodos);
  } 

Como hago para ponerle mas de 5 estrellas al curso 😂

En resumen, se podria decir que los hooks son funcionalidades que tiene react por defecto que nos permiten hacer x cosas (desde setear datos por defecto en useState o hacer que haya un cambio de un elemento en un elemento con useEffect) y podemos crear nuestros propios hooks, que no son mas que funciones de toda la vida.
Que manera genial de explicar….
Lo que no me gusta del local Storage, es que si eliminas todo lo compketado, siempre te carga en donde quedó. Y exactamente es eso, quedó sin tareas. Hasta este punto del curso n otendras como ahcer pruebas por que siempre retornará un array vacio.
Trato de entender la funcionalidad de React y los hooks pero que enredoso todo eso de los TODOs, paso mas tiempo entendiendo la funcionalidad de la app que viendo los conceptos de react
Creo que esta clase sí necesitaba una explicación más teórica al inicio para no confundirse tanto con tanto copy y paste de código.
Juan tienes tanta energía en tus cursos y transmites buena vibra, pero solo eso, ya que tengo que comentar que la forma en la que explicas cursos como este no es la más efectiva ya que hablas mucho y deambulas en muchos temas que obvio tu si entiendes a la perfección pero no sabes transmitir a los demás, y adicional a eso en todas tus clases dices: en esta clase aprendimos esto y aquello, como si realmente lo hubieras explicado bien, repito: lo explicaste a como tu lo entiendes más no a como lo pueda entender alguien más saludos
La verdad siento que no es un buen ejemplo para realizar un custom hook, se cambia muchas cosas en la aplicación y no se ve el verdadero beneficio de la explicación y mas se convierte en seguir el paso a paso, considero que es mejor tener otra aplicabilidad, voy a seguir con los datos anteriores y probablemente sera un problemas mas adelante pero ni modo.
Yo termine la clase medio perdido igual que varios en los comentarios. Al menos lo que me paso a mi fue que al terminar la clase anterior del **Local Storage** vi inmediatamente después esta clase y se me mezclaron los temas de ambas clases. Si te paso lo mismo, hay que tener en claro que el **Local Storage** lo usamos para la "persistencias" y los **Custom Hooks** para encapsular código y abstraernos un poco más en la utilidad que tiene cada función. (Así lo entendí yo, no se si estará del todo bien jaja). Saludos!
terrible hasta ahora todo el curso
Hola!!! la URL que dejaste en recursos para seguir avanzando en los temas de Hooks, no me funciona, me podrías enviar una nueva porfa! Muchas gracias

let’s Go!!