useContext
Clase 17 de 23 • Curso de React 17
Contenido del curso
Clase 17 de 23 • Curso de React 17
Contenido del curso
Luis Fernando Rodriguez Boett
Luis Berenguer
Lucas Frezzini
Luis Fernando Rodriguez Boett
Lucas Frezzini
Xavier Medina Veintimilla
Juan Castro
Xavier Medina Veintimilla
fredic yohany rojas
Lucas Frezzini
César Andrés Baudi Ventura
Ludwig Jonathan Perez Villamar
Nicolas Vezzali Dussio
Jairo Campos Ruiz
Ricardo Carranza
Eduardo Peña Ramos
Alejandra Franco Tobon
javier partida valle
Héctor Eduardo López Carballo
Andrés Muñoz
Ernesto Gerardo Liberio Vera
Guadalupe Monge Barale
Obed Paz
Reinaldo Mendoza
Jonnier Martinez
Sara Ramírez Andrade
milton coronado
Carlos Rodríguez
Nicolás Valderrama
Eduardo Peña Ramos
Rubén Cuello
Basicamente, la formula de useContext es
import { Contexto } from './direccionContexto/' const { value } = React.useContext(Contexto)
Perfecto!
Me encanto este video, me venia haciendo mucho ruido la forma de pasar props padre>hijo>nieto>...>x todo el tiempo.
.
Creo que esta técnica es excelente. ¿Hay alguna forma de como investigar sobre estos patrones por asi decirlo, para buscar buenas prácticas de como escribir nuestros componentes en React?
.
Si ya desde el principio comienzo a escribir con buenas prácticas creo que va a ser mejor y hará más claro mi código.
Esa forma de pasar props se volvia molesta. Y a veces tenias que cambiar algunas partes del codigo si no estabas pendiente de que tenia que tenias que pasar props xd
Lo gracioso es que esta tecnica es un poco avanzada segun la documentacion, pero no esta nada mal para la introduccion a React
En realidad más que una técnica avanzada, es una técnica nueva, estuve leyendo la documentación y los Reacts Hooks, están desde la v16+, antes para usar estados tenias que convertir tus componentes funcionales (los componentes que son funciones, como usamos en este curso) a componentes de clase extendiendo de React.Components y dentro de estas clases usar this.state.
.
Supongo que además de hacer una mejor forma de crear componentes, estos Hooks vinieron para solventar ese problema.
En React, cuándo debo iniciar con mayuscula o minuscula el nombre del archivo como por ejemplo TodoCounter.js o useLocalStorage.js?
Los archivos de componentes siempre te recomiendo iniciarlos con mayúscula. Los archivos que solo guarden custom hooks pueden empezar con use en minúscula.
Gracias Juan! Me encantó el curso, 5 estrellas cuando acabe y continuaré con el resto de la serie.
Si vienes de Vue, puedes utilizar una herramienta muy similar y mas facil de manejar llamada provide/inject. Buscalo en la documentacion de vue.
provide/inject
No se olviden que el argumento de useContext debe ser nuestro objeto contexto y no por separado el provider o el consumer, como el profe lo habia planteado que podria usarse cuando lo haciamos con la otra técnica sin el hook useContext
.
Correcto: useContext(MiContexto)
Incorrecto: useContext(MiContexto.Consumer)
Incorrecto: useContext(MiContexto.Provider)
Por si a alguien le habia ocurrido un error con el useContext.
Si al usar useContext el componente da error al usar algun objeto del destructuring, es porque donde estas usando el useContext no está presente el Provider.
En caso de que sí, es porque tienes el provider y el useContext en el mismo componente, y estos van separados.
Muchas gracias, justo eso me paso. Me había saltado la parte de crear el archivo de AppUI y todo lo manejaba desde la App. Y luego con los errores de react que son un poco difíciles de leer. Me haz salvado
muchas gracias por el aporte! me estaba volviendo loco ya jajaj
Por si a alguien le interesa os dejo como implemente el provider y el use context con TypeScript, no se si será la mejor manera pero por lo que estuve viendo es una de las manera de hacerlo:
Primero de todo cuando hacemos el createContext se le pasa una inteface con todo lo que contendrá el context, el tipado si os fijáis tiene que ser con opción a null puesto que se inicializa a null.
export type TodoContextInterface = { createTodoValue: string; setTodoValue: React.Dispatch<React.SetStateAction<string>>; addTodo: () => void; completedTodos: number; totalTodos: number; searchValue: string; setSearchValue: React.Dispatch<React.SetStateAction<string>>; toogleFilterComplete: () => void; filterComplete: boolean; todosFiltered: Todo[]; completeTodos: (text: string) => void; deleteTodos: (text: string) => void; } const TodoContext = createContext<TodoContextInterface | null>(null);
Seguido creamos la función todoProvider que cambia muy poco de la que se hace en JavaScript, solo que en este caso creo el objeto y luego se lo paso al value.
const context: TodoContextInterface = { createTodoValue, setTodoValue, addTodo, completedTodos, totalTodos, searchValue, setSearchValue, toogleFilterComplete, filterComplete, todosFiltered, completeTodos, deleteTodos, } return ( <TodoContext.Provider value={context}> {props.children} </TodoContext.Provider> );
La implementación del TodoProvider en App es exactamente igual.
function App() { return ( <TodoProvider> <AppUI /> </TodoProvider> ); } export default App;
A la hora de extraer los datos con use context si cambia algo porque tenemos que hacer comprobación de que no vengan a null puesto que los inicializamos a null. Por ello en lugar de hacerlo una y otra vez en los componentes creé un customHook que extrae los datos y los devuelve cuando lo llamas. Este hook puede hacerse mas reutilizable pasándole parámetros pero como no es muy grande la aplicación tampoco lo vi necesario.
import { useContext } from "react"; import { TodoContext } from "../context/todoContext"; function useTodoContext() { const todoContext = useContext(TodoContext); if(todoContext === null) throw new Error('Todo need a context'); return todoContext; } export { useTodoContext };
Y aquí estaría la implementación en los componentes, en los cuales llamo a mi customHook.
import { useTodoContext } from "../hooks/useTodoContext"; export default function TodoCounter() { const { completedTodos, totalTodos } = useTodoContext(); return ( <h2 className="subtitle">Completed {completedTodos} to {totalTodos} tasks</h3> ); }
Espero os sirva de ayuda y si alguien sabe una manera mejor de implementarlo por favor compartir puesto que no siempre es fácil encontrar contenido en TypeScript.
Friendly reminder 😁 Al momento de usar la destructuracion podemos renombrar las propiedades para utilizarlas con el nombre tal cual estaban:
const { totalTodos: total, completedTodos: completed } = React.useContext(TodoContext);
Así es. De hecho no sé cuándo ni cómo, VSCode al renombrar esos nombres me añadió todo ese código. 🤔
gracias! lo estaba tratando de usar al revés jeje
he revisado el código varias veces y lo tengo igual, pero no sé por qué me aparece el siguiente error:
TypeError: Cannot destructure property 'error' of
Hola!
Podrías compartir el error completo que te sale en la consola, por favor?
revisa si estas declarando error en el value del context provider... :/
explica bien pero. a veces marea con tanta emocion que le coloca por decirlo asi
Aprovechando esta maravilla de useContext modifiqué mi TodoCounter asi .
function TodoCounter() { const {totalTodos, completedTodos, loading, searchedTodos } = useContext(TodoContext) if (!loading && !searchedTodos.length) { return ( <h2 className='TodoCounter'>Crea tu primer TODO 💪</h3> ) } else { return ( <h2 className='TodoCounter'>Has completado {completedTodos} de {totalTodos} TODOs 💪</h3> ) } }
Me encantó este hook.
Ya decia yo que el consumer era un poquito engorroso xd
Al menos no tanto como pasar props como por 5 niveles pero ya que existe useContext sin duda empezaré a implementarlo en mis proyectos :3
. Es como declarar estados globales.
Single responsibility, excelente curso
Eso de cortar sin miedo es peligroso porque te salen mil errores, pero una vez los solucionas te siente un PRO hacker+ de la computación
venia toda seria siguiente el video y la emoción del 4:31 me hizo estallar de risa 🤣
no se porqie veo comentarios renegando hacerca de modificar la estructura del proyecto, dicen que se confunden y la aplicacion ya les anda.... consejo, si te sucede eso es que estas corriendo y no aprendiendo
Mi esructura de carpetas por el momento
Llevaba un tiempo trabajando con React, lo había aprendido a tropezones y prueba y error hasta que le cogí gusto. Este curso me está abriendo mucho los ojos y haciendo cogerle mucho más gusto y buenas practicas :3
"No le tengas miedo a borrar". No es miedo, es "precaución" 😂
En esta clase no rompí todo el código al cortar, copiar, pegar. Voy a tomar eso como una victoria :smile: