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
14 Hrs
49 Min
25 Seg
Curso de React.js

Curso de React.js

Juan David Castro Gallego

Juan David Castro Gallego

useContext

23/34
Recursos

Aportes 29

Preguntas 9

Ordenar por:

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

Al principio me pareció un poco confuso usar TodoContext.Provider, con useContext() es muchisimo más sencillo y legible!

Según la documentación nueva oficial de React, manifiestan que no es recomendado usar Consumer y que poco a poco empezara a entrar en desuso, Entonces viva, useContext.

Direferncias al usar Context.Consumer con useContext.

Cuando necesitamos pasar los datos establecidos en el Context:

function TodoProvider({children}){
	// Funcionalidades del provider
	return (
    <TodoContext.Provider>
			{children}
		</TodoContext.Provider>
	)
}

La principal diferencia es el uso de TodoContext.Consumer dentro del componente que queramos comunicar con las props. Y el metodo por useContext que no implica pasar como si fuera un componente la sintaxis del Consumer.

  • Consumer: Acepta una funcion de renderizado:
<TodoContext.Consumer>
	{
		({ props necesarias }) => { // Todos los componentes para pasar las props }
	} 
</TodoContext.Consumer>
  • useContext: Similar al uso del hook useState solo se declaran las props necesarias dentro del componente.
const { props necesarias } = useContext(TodoContext)

Gracias a esa explicacion de la clase Que es React Context, ahora tiene sentido como se trae el contexto con el hook useContext.

Bueno pues en el momento de las clases anteriores donde el profe creo el componente AppUI , pues yo preferi no hacerlo y segui con el app normal metiendo todo ahi.

Esto me llevo a un pequeño problema al querer recrear lo que el profesor hizo en el video.

No podemos usar el provider en el mismo lugar donde vamos a usar el useContext.
Me toco ponerlo en el index.js para que luego en el componente App me permitiera usar el use context.

Si le dejaba el provider ahi, pues se rompia todo

Asi que lo elimine de ahi y le deje las <>...</> y ya.

Por si a alguien mas le pasa, pues nada ese es el motivo que no funcione bien

Les comparto una forma en la que me parece interesante exportar nuestros contexts. Esto sería creando nuestro propio hook para dicho context así:

// useStateContext.js

import React, { createContext, useContext } from "react";

const Context = createContext();

export const StateContext = ({ children }) => {
    // ... Toda nuestra lógica

    return (
        <Context.Provider value={{
            // ... Nuestros valores a exportar
        }}>
            {children}
        </Context.Provider>
    );

}

export const useStateContext = () => useContext(Context);


Como puedes ver, así exportaríamos nuestro StateContext y nuestro useStateContext, el cual ya utiliza el useContext; de esta forma, en los componentes podremos importarlos así:

// TuComponente.js

import { useStateContext } from '../Context/useStateContext';

function TuComponente() {

	const {...tus valores a importar} = useStateContext();

	return(
		<></>
	);

}


Así ya no tendremos que estarle indicando qué contexto queremos usar. Y en caso de tener varios contextos como nos enseña Juan, por ejemplo tener uno para los usuarios, otro para validaciones, ordenes… sería tan sencillo como importar dicho contexto y llamarlos como useUserContext(), useValidationContext(), useOrderContext()… según corresponda. 😀

Desde la clase anterior cuando implementamos Context mi app se murió 😦

Así solucioné el problema al usar el buscador ```jsx {((!loading && totalToDos == 0)) &&

Crea tu primer Todo

}        {((!loading && searchTodos == 0 && totalToDos > 0)) &&

No hay coincidencias

} ```
  • import { Contexto } from ‘./direccionContexto/’

  • const { value } = React.useContext(Contexto)

  • useContext acepta un objeto de contexto (el valor devuelto de React.createContext) y devuelve el valor de contexto actual. El valor actual del contexto es determinado por la propiedad value del <MyContext.Provider> ascendentemente más cercano en el árbol al componente que hace la llamada.

Super cool, no conocía esto. Antes usaba solo Redux

Mi aporte consiste en agregar una alternativa empty State al buscador, además del initial State que ya había tratando de mantener un código legible en el camino. Usamos un operador ternario para verificar si no está cargando (`!loading`) y `searchedTodos` está vacío (`searchedTodos.length === 0`). Dentro de esta verificación, anidamos otro operador ternario para distinguir entre si hay un término de búsqueda (`searchTerm`) o no.* Si hay un término de búsqueda (`searchTerm`), muestra `<TodosEmptyState />`. * Si no hay un término de búsqueda (`!searchTerm`), muestra `<TodosInitState />`. * **Caso por Defecto**: Si `searchedTodos` no está vacío, se muestra la lista de `TodoItem`.![](https://static.platzi.com/media/user_upload/image-abffa857-1bab-4ef3-a444-3a3f65aebe74.jpg)
En caso de que no queramos cambiar los nombres de las propiedades, podemos redefinirlos en el objeto. Algo útil si tenemos que cambiar muchas propiedades en muchos sitios ```jsx const { completedTodos: completed, totalTodos: total, } = React.useContext(TodoContext) ```
Realmente a medida que transcurre el curso y se empieza a Volver complicado entender todo el Código, surgen nuevas alternativas como el TodoContext para Volver a organizer y estructurar la lógica. Ahora puedo entender nuevamente el aplicativo de principio a fin
`TodoContext.Provider`***<u> y </u>***`useContext()` son herramientas proporcionadas por React para gestionar el estado y compartir datos entre componentes de la aplicación de manera eficiente. Aquí hay una descripción de cada uno y cuándo usarlos: 1. **TodoContext.Provider**: * `TodoContext.Provider` es parte del Context API de React. Se utiliza para proporcionar un contexto a los componentes secundarios de un árbol de componentes React. * Permite pasar datos a lo largo de la cadena de componentes sin tener que pasar explícitamente props a través de cada nivel de la jerarquía. * Se utiliza para envolver un conjunto de componentes secundarios que necesitan acceder a los datos proporcionados por el contexto. * Se utiliza principalmente en la capa superior de la aplicación para proporcionar el contexto que será consumido por varios componentes secundarios. 2. **useContext()**: * `useContext()` es un hook de React que se utiliza para acceder al valor proporcionado por un contexto. * Permite a los componentes de función suscribirse al contexto y leer su valor actual. * Reemplaza la necesidad de utilizar `TodoContext.Consumer` en componentes de función y proporciona una forma más limpia y concisa de acceder al contexto. * Se utiliza dentro del cuerpo de un componente de función y toma un contexto como argumento para devolver el valor actual del contexto. En resumen, `TodoContext.Provider` se utiliza para proporcionar datos a través de un contexto, mientras que `useContext()` se utiliza para consumir esos datos en componentes de función. Estas herramientas son útiles cuando necesita compartir datos entre múltiples componentes sin pasar props manualmente a través de cada nivel de la jerarquía de componentes.
All what I hear is: 1\. Destructuring en todos lados.
Bua mil veces mejor usar useContext :D que genial que lo inventaron.

UYY que bueno, mucho más limpio y fácil!!!

React.useContext god

Muy Bueno la combinación de TodoContext y el useContext.
El TodoContex nos permite exponer parametros de manera general en el app mediante el TodoContext.provider. Y mediante el TodoContext.consumer recuperamos los parametros expuestos pero esto resulta algo que ensucia el codigo, es por ello que usamos el hook useConext.

Si alguna vez les llega a salir este error

Me sale este error “TypeError: render is not a function

Ese error se da ya que posiblemente en tu app() en el componente estas llamando al Context, lo que tienes que hacer es llamar a la funcion y no al Context

De la siguiente manera:

functionApp() {
  return (
    <TodoContext>
      <AppUI/>
   </TodoContext>
    
  );
}
 

en esta linea de codigo lo que estas llamando es el Context en general y sino estoy mal lo que esta haciendo es renderizando por lo tanto sale el error, lo mas recomendable es crear una funcion en donde podamos tener toda la parte de los componentes y la logica en esa funcion

Dicho esto deberia quedar el codigo en la clase App asi:

//Esta funcion es un componente 
functionApp() {
  return (
    <TodoProvider>
      <AppUI/>
   </TodoProvider>
    
  );
}

El <TodoProvider> hace referencia al nombre de mi función

Que alivio esta forma de escribir un contexto 🙂🦊

Proyecto en codigo TS:

import { FC, useContext } from "react";
import { TodoContext } from "../TodoContext";
import './TodoCounter.css'

const TodoCounter:FC = () => {

    const {
        completedTodos,
        totalTodos
    } = useContext(TodoContext)
 
    return (
        <h1 className="TodoCounter">Has completado <span>{completedTodos}</span>  de <span>{totalTodos}</span></h1>
    )
}

export { TodoCounter }

import { FC, useContext } from "react";
import { TodoContext } from "../TodoContext";
import './TodoSearch.css'

const TodoSearch:FC = () => {

    const {
        searchValue,
        setSearchValue
    } = useContext(TodoContext)

    return (
       <input 
        type="text" 
        className="TodoSearch" 
        placeholder="Ingresar nombre de tarea buscada" 
        value={searchValue}
        onChange={(event)=>{
            setSearchValue(event.target.value)
        }}
    />
    )
}

export { TodoSearch }

import { FC, useContext } from "react"
import { TodoButton } from "../TodoButton"
import { TodoCounter } from "../TodoCounter"
import { TodoItem } from "../TodoItem"
import { TodoList } from "../TodoList"
import { TodoSearch } from "../TodoSearch"
import { TodosError } from "../TodoError"
import { EmptyTodos } from "../EmptyTodo"
import { TodosLoading } from "../TodoLoading"
import { TodoContext } from "../TodoContext"

export const AppUI:FC = () => {

  const {
    loading,
    error,
    searchedTodos,
    completeTodo,
    deleteTodo,
  } = useContext(TodoContext);

  return (
    <>
      <TodoCounter />
      <TodoSearch  />
      <TodoList>
      {loading && (
        <>
          <TodosLoading />
          <TodosLoading />
          <TodosLoading />
        </>
      )}
      {error && <TodosError />}
      {(!loading && searchedTodos.length === 0) && <EmptyTodos />}
      {
        searchedTodos.map(todo=>(
          <TodoItem
            key={todo.text}
            text={todo.text}
            completed={todo.completed}
            onComplete={()=>{completeTodo(todo.text)}}
            onDelete={()=>{deleteTodo(todo.text)}}
          />
        ))
      }
      </TodoList>
      <TodoButton />
    </>
  )
}


ME ENCANTO ESTA CLASE!

con tantas props al inicio, pense que eso era lo mas complicado de react y me estaba pareciendo un framework muy complicado, con el context ya todo tiene sentido jajaja
**USECONTEXT** *El **hook*** **useContext** *en* **React.js** *es una **herramienta** **poderosa** que **simplifica** la **utilización** del **Context*** **API***. **Introducido** en* **React 16.8***,* **useContext** *permite a los **desarrolladores** **acceder** **directamente** a los **valores** de un **contexto** en **cualquier** **componente** **funcional**, **sin necesidad** de **usar** un* **Context.Consumer***. Al **recibir** el **contexto** como **argumento**,* **useContext** ***devuelve** el **valor** **actual** del **contexto**, **proporcionando** una **forma** **eficiente** y **limpia** de **compartir** **datos** **globales**, como **configuraciones** de **tema**, **autenticación** o **datos** de **usuario**, **entre múltiples** **componentes** de una **aplicación**. Esto **elimina** la **necesidad** de **"prop drilling"** y **mejora** la **legibilidad** y **mantenibilidad** del **código**.*
Genial 🤩
**¿En qué casos es conveniente utilizar \<SomeContext.Consumer>?** Es altamente recomendable utilizar el hook `useContext()` al comenzar un proyecto **desde cero**. Sin embargo, en el ámbito laboral, es posible que te encuentres con empresas que han adoptado la práctica de usar `<SomeContext.Consumer>`. En tales casos, podrías necesitar emplearlo. Esto se debe a que esta es la forma más antigua de trabajar con contextos en versiones anteriores de React, y muchas empresas aún no han optado en actualizar su código. Recuerda que, aunque `useContext()` es preferible, siempre es importante adaptarse al ambiente laboral presente y las prácticas existentes en el entorno de desarrollo.
```jsx // Así solucioné ek problema de el comentario al hacer bsuqueda de ToDos {((!loading && totalToDos == 0)) &&

Crea tu primer Todo

} {((!loading && searchTodos == 0)) &&

No hay coincidencias

```
No sé a mí se me hace mucho más confuso y desordenado :c

Un dato importante que pude observar. Para el caso de no utilizar useContext() dentro de un componente, este ultimo envuelto por un provider. No se renderiza dicho componente en caso cambie algún estado del hook context. Al inicio pensé que se renderizaría por estar envuelto por el provider.