DEV Community

Cover image for React context
Stanley Gomes
Stanley Gomes

Posted on • Updated on

React context

O que é?

React context foi criada com intuido de compartilhar dados que podem ser considerados como "dado global" para uma árvore de componentes.

É necessário usar com cuidado, pois isso pode tornar o componente menos utilizável.

Alt Text
Image by modus create

Por que precisamos da API React context?

Por vezes precisamos acessar uma mesma informação em diferentes componentes em diferentes níveis de uma árvore, como por exemplo: tema da aplicação, linguagem selecionada, dados de autenticação/usuário.

Utilizando esta API, você não precisa passar essas informações via props dentre toda a árvore de componentes da aplicação.

Alt Text

Outra utilidade dessa API é a atualização destes dados, já que não é possível atualizar props nos componentes pais, pelos componentes filhos.

Como utilizar

A lógica do React Context é baseada em 2 conceitos: PROVIDER e CONSUMER. Provider é o componente que recebe os dados e gerencia o armazenamento das informações, já o Consumer é o componente que, veja bem, consome os dados.

Veja abaixo um exemplo. Nesse primeiro momento será criado o store que vai gerenciar os dados.

const ThemeContext = React.createContext(null);
Enter fullscreen mode Exit fullscreen mode

Agora temos o componente pai que é o provider.


function App() {
  const defaultTheme = "light";
  const [theme, setTheme] = useState(defaultTheme);

  return (
    <ThemeContext.Provider value={{ theme, setTheme }}>
      <Header />
      <Body />
    </ThemeContext.Provider>
  );
}

Enter fullscreen mode Exit fullscreen mode

Um dos componentes filhos que está acessando o dado salvo, como o a variavel theme por exemplo.

function Header() {
  const { theme } = useContext(ThemeContext);
  const style = themeStyle[theme];

  return (
    <div>
      <div className="header" style={{ ...style.background, ...style.text }}>
        Death Star
      </div>
    </div>
  );
}
Enter fullscreen mode Exit fullscreen mode

Por fim, o componente filho que altera o contexto em todos esses componentes dessa árvore utilizando a função setTheme, enviando o parâmetro de tema.


function Body() {
  return (
    <ThemeContext.Consumer>
      {({ setTheme }) => {
        return (
          <div className="body">
            <button type="button" onClick={() => setTheme("light")}>
              Tema claro
            </button>
            <button type="button" onClick={() => setTheme("dark")}>
              Tema escuro
            </button>
          </div>
        )
      }}
    </ThemeContext.Consumer>
  );
}

Enter fullscreen mode Exit fullscreen mode

O exemplo completo e funcional no codesandbox pode ser acessado nesse link.

React Context vs Redux

Alt Text
image by Weekly WebTips

Escolher entre um e outro é uma decisão de projeto. A forma como você trabalha vai determinar qual é melhor para seu cenário.

O fato é que a maior desvantagem do Redux é a quantidade de código que é necessário escrever para projetar pequenos gerenciamentos de estado, bem como a complexidade da curva de aprendizado para implementação.

Um argumento do outro lado é que o Redux por ser mais declarativo deixa o gerenciamento de estado mais documental.


Este post não seria possível sem o trabalho de pesquisa e discussão do time do capítulo de frontend do LuizaLabs.

Obrigado pela leitura! Espero que possa ter ajudado. 🚀

Até mais.

Latest comments (2)

Collapse
 
luizzzdev profile image
Luiz Fernando Rodrigues Sanches

Legal pra caramba, parabéns! Pra complementar esse assunto, um tópico bem legal é a questão de como melhorar o desempenho quando utilizamos o Context API, principalmente no quesito de evitar que os consumers re-renderizem desnecessariamente.

Collapse
 
stanley profile image
Stanley Gomes

Que bom que você gostou luiz. Essa semana a gente vai ter uma call do capítulo de frontend para discutir sobre esse assunto. Vou levantar esse assunto para discussão. Obrigado pela sugestão.