Normalmente numa aplicação React, nós passamos informações através do componentes de cima para baixo, como um funil, através de props. Porém de acordo com a complexidade da aplicação e com a reutilização de componentes, esse envio de props pode-se mostrar totalmente ineficiente e confuso.
Usando o contexto, é possível criar uma área que compartilha todos os dados para os componentes pertencente à esse contexto e com isso diminuir e muito o envio das informações comuns à diversos componentes.
Contexto (context como é descrito no React) é indicado para compartilhar dados dentro da área em comum que podem ser considerados “globais”. Normalmente alguns casos que nós usamos são usuário autenticado, idioma preferido ou valores que são pertencentes à mais de um componente da mesma árvore de componentes.
No exemplo do código a seguir, nós passamos um tema para a fim de estilizar o componente Header porém também vamos usar esse tema para estilizar o componente Footer.
class App extends React.Component {
render() {
return <div>
<Header tema="dark" />
<Footer tema="dark" />
</div>
}
}
function Header(props) {
return (
<div>
<HeaderButton tema={props.tema} />
</div>
);
}
function Footer(props) {
return (
<div>
<FooterLink tema={props.tema} />
</div>
);
}
class HeaderButton extends React.Component {
render() {
return <Button tema={this.props.tema} />;
}
}
class FooterLink extends React.Component {
render() {
return <Link tema={this.props.tema} />;
}
}
// Criamos um contexto (context) para o tema atual (com "light" como padrão).
const ThemeContext = React.createContext("light");
class App extends React.Component {
render() {
return (
<ThemeContext.Provider value="dark">
<Header />
<Footer />
</ThemeContext.Provider>
);
}
}
function Header(props) {
// Esse componente não precisa mais enviar a props tema explicitamente
return (
<div>
<HeaderButton />
</div>
);
}
function Footer(props) {
// Esse componente não precisa mais enviar a props tema explicitamente
return (
<div>
<FooterLink />
</div>
);
}
class HeaderButton extends React.Component {
// O React vai encontrar o Provider (é como a gente chama o contexto) mais próximo
// E vai usa-lo
static contextType = ThemeContext;
render() {
return <Button tema={this.context} />;
}
}
class FooterLink extends React.Component {
static contextType = ThemeContext;
render() {
return <Link tema={this.context} />;
}
}
O Context veio como solução para gerenciamento de informações que são muitas vezes usados, dentro de um contexto específico, porém ele não foi feito para substituir um gerenciador de estados como Redux e sim complementa-los.
O principal objetivo do Context é evitar o props drilling, ou seja, vazamento de props que é exatamente o envio de props por diversos componentes, porém para gerenciamentos mais complexos e de diversas informações e ações ao mesmo tempo, vale considerar o uso de uma biblioteca como o Redux para te auxiliar nessa tarefa.
Existem duas situações que a equipe do React não te recomenda utilizar o Context, a primeira delas é quando você precisa passar a informação adiante uma vez ou poucas, sem muitas complexidades. E por ser algo tão simples, você não deveria se preocupar com o Context e a outra situação é quando o compartilhamento torna a reutilização dos seus componentes tão difíceis que você também não deveria utilizar somente o Context e sim um gerenciador de estados também
©2022 Aleksander Palamar. All rights reserved | CNPJ 26.328.604/0001-55