0Pricing
React Academy · Aula

Contexto do React para o estado do tema

Crie um ThemeProvider que disponibilize o tema atual e uma função de alternância para toda a árvore de componentes.

Contexto do React para o estado do tema é uma aula grátis de React Academy no CoddyKit. Esta é a aula 3 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de React Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de React Academy inclui 4 aulas no total.

Criando ThemeContext

Comece chamando createContext() com um valor padrão que corresponda ao formato do seu contexto: const ThemeContext = createContext({ theme: 'light', toggleTheme: () => {} }). O valor padrão é usado somente quando um componente lê o contexto sem um provedor pai, o que ajuda a testar componentes isolados.

O componente ThemeProvider

O componente ThemeProvider é um componente envolvente que contém toda a lógica do tema. Ele lê a preferência do sistema na montagem, gerencia o estado de theme, fornece uma função toggleTheme e envolve os componentes filhos com ThemeContext.Provider value={{ theme, toggleTheme }}. Posicione-o próximo ao topo da árvore de componentes.

Consumindo o contexto com useContext

Qualquer componente descendente pode acessar o tema chamando useContext(ThemeContext). Isso retorna o valor atual do contexto, incluindo theme e toggleTheme. O componente é renderizado novamente automaticamente quando o tema muda, mantendo tudo sempre sincronizado sem precisar repassar propriedades.

Sincronizando data-theme com o DOM

As variáveis CSS dependem de um atributo data-theme no elemento raiz. Em ThemeProvider, adicione um useEffect que seja executado sempre que theme mudar: document.documentElement.setAttribute('data-theme', theme). Isso conecta perfeitamente o estado do React à camada CSS.

Armazenando a preferência do usuário em localStorage

Para preservar a escolha do usuário entre recarregamentos da página, grave-a em localStorage sempre que o tema mudar: localStorage.setItem('theme', theme). Você pode encapsular essa lógica em um gancho personalizado useLocalStorage que retorna um par semelhante a um estado e persiste cada atualização automaticamente.

Inicializando o tema a partir de localStorage

Ao inicializar o estado do tema, leia primeiro de localStorage: localStorage.getItem('theme'). Se não existir um valor armazenado, use como alternativa a preferência do sistema por meio de window.matchMedia('(prefers-color-scheme: dark)').matches. Essa inicialização é executada apenas uma vez na montagem.

Ordem de prioridade do tema

A prioridade correta, da maior para a menor, é: a preferência do usuário armazenada em localStorage, depois a preferência do sistema operacional e, por fim, um padrão definido no código, geralmente claro. Essa ordem garante que o usuário sempre tenha o controle final, ao mesmo tempo que respeita a configuração do sistema operacional caso ele ainda não tenha feito uma escolha no aplicativo.

O gancho de conveniência useTheme

Chamar diretamente useContext(ThemeContext) em cada componente expõe detalhes de implementação. Em vez disso, exporte um gancho useTheme: function useTheme() { return useContext(ThemeContext); }. Agora os componentes importam useTheme e o chamam sem conhecer o contexto subjacente.

Fornecendo uma função de alternância

A função toggleTheme alterna entre light e dark: setTheme(prev => prev === 'light' ? 'dark' : 'light'). Exponha-a pelo contexto para que qualquer botão em qualquer ponto da árvore possa acioná-la. O estado fica em um único lugar; a lógica de alternância é compartilhada em todos os lugares.

Memorizando o valor do contexto

O objeto de valor do contexto é recriado a cada renderização de ThemeProvider. Envolva-o em useMemo para evitar renderizações novamente desnecessárias de todos os consumidores do contexto: const value = useMemo(() => ({ theme, toggleTheme }), [theme]). Essa é uma otimização de desempenho comum para provedores de contexto.

Testando ThemeProvider

Nos testes, envolva as renderizações em um utilitário personalizado renderWithTheme que use ThemeProvider como componente envolvente. Você também pode criar um contexto simulado simples para testes isolados: ThemeContext.Provider value={{ theme: 'dark', toggleTheme: jest.fn() }}. Isso permite testar componentes em um estado de tema específico.

Ordem de prioridade do tema

Qual é a ordem correta de prioridade para inicializar o tema do aplicativo, da maior para a menor prioridade?

Recapitulação da lição: contexto do React para o estado do tema

Crie um ThemeContext e um ThemeProvider que gerencie o estado do tema, sincronize-o com localStorage e defina data-theme no documento. Use um gancho de conveniência useTheme para um consumo organizado. A ordem de prioridade é: preferência armazenada, depois preferência do sistema e, por fim, o padrão.

Perguntas Frequentes

A aula “Contexto do React para o estado do tema” é grátis?

Sim — o texto completo de “Contexto do React para o estado do tema” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de React Academy, atualize para CoddyKit PRO. O curso de React Academy inclui 4 aulas no total.

O que vou aprender em “Contexto do React para o estado do tema”?

Crie um ThemeProvider que disponibilize o tema atual e uma função de alternância para toda a árvore de componentes. Você pratica React Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar React Academy?

Nenhuma experiência prévia é necessária. React Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 4.

Quanto tempo leva a aula “Contexto do React para o estado do tema”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de React Academy?

Sim. Cada aula de React Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Detectando o esquema de cores do sistema
  2. Variáveis CSS para alternância de temas
  3. Contexto do React para o estado do tema
  4. Persistindo o tema e evitando o flash
← Voltar para React Academy