Context
El API de contexto nos permite compartir valores y funcionalidades a través del árbol de componentes sin necesidad de usar props.
Creando un contexto
Para crear un contexto hay que usar la función React.createContext. React.createContext recibe como argumento el valor predeterminado del contexto.
Es posible crear tantos contextos como sea necesario.
const Context = React.createContext({ count: 0, setCount: () => {} });
Al crear un contexto se crea un objeto que consta de dos partes, Context.Provider y Context.Consumer.
Context Provider
El Context.Provider es un componente que recibe un prop value que serán los valores a compartir. Todos los componentes renderizados dentro de este componente tendran acceso a los valores del contexto.
const App = () => {
const [count, setCount] = React.useState(0);
return (
<Context.Provider
value={{
count,
setCount
}}
>
<Component>
</Context.Provider>
);
}
Los valores del contexto en este caso serían count y setCount creados previamente usando el hook useState. Tanto Component como sus hijos van a poder acceder a estos valores.
Consumir los valores del contexto
Al consumir un contexto, React busca el Provider más cercano para consumir su valor. En caso de no encontrar un Provider, el valor será el valor predeterminado al crear el contexto. Existen 3 formas de consumir los valores contexto:
Context Consumer
Consumer es el componente que nos permite consumir los valores del contexto usando una técnica llamada Render Props.
Este método se puede usar tanto en componentes clase como en componentes función.
const Component = () => {
return (
<Context.Consumer>
{(value) => {
return (
<div>
<span>{value.count}</span>
<button
type="button"
onClick={() => value.setCount(value.count + 1)}
>
Click
</button>
</div>
);
}}
<Context.Consumer>
)
}
Render Props renderiza una función en vez de un componente y recibe como argumento los valores del contexto.
Para aprender más sobre Render Props visita la guía oficial de Render Props.
useContext hook
Es posible consumir los valores del contexto y almacenar los valores en una variable usando el hook useContext. useContext recibe como argumento el contexto que se desea consumir.
Usando este método es posible consumir varios contextos desde un mismo componente.
const Component = () => {
const context = useContext(Context);
return (
<div>
<span>{context.count}</span>
<button
type="button"
onClick={() => context.setCount(context.count + 1)}
>
Click
</button>
</div>
)
}
Método estatico contextType
La última forma de consumir los valores de un contexto es usando el método estático contextType.
Este método solo está disponible para componentes clase y solo es posible consumir un contexto a la vez.
class Component extends React.Component {
static contextType = Context;
render() {
return (
<div>
<span>{this.context.count}</span>
<button
type="button"
onClick={() => this.context.setCount(this.context.count + 1)}
>
Click
</button>
</div>
);
}
}
// Otra manera de definir métodos estáticos
class Componente extends React.Component {
render() {
return (
<div>
<span>{this.context.count}</span>
<button
type="button"
onClick={() => value.setCount(this.context.count + 1)}
>
Click
</button>
</div>
);
}
}
Component.contextType = Context
Para una guía completa de los hooks visita la guía oficial de Context.