O DSFilter é uma aplicação front-end desenvolvida durante o treinamento ReactJS Professional
da DevSuperior, com o objetivo de reforçar conceitos avançados em React, TypeScript e Vite. A aplicação oferece uma interface para filtrar produtos, demonstrando a eficácia da Context API
do React na gestão de estados globais.
- Gestão de estado global com Context API.
- Filtros dinâmicos para listagem de produtos.
- Aplicação de TypeScript para reforçar a segurança e escalabilidade do código.
- Ambiente de desenvolvimento otimizado com Vite.
DSFilter/
├── src/
│ ├── assets/...
│ ├── components/
│ │ ├── common/
│ │ │ ├── Card/
│ │ │ │ └── ...
│ │ │ ├── Filter/
│ │ │ │ └── ...
│ │ │ ├── Header/
│ │ │ │ └── ...
│ │ │ └── ProductList/
│ │ │ └── ...
│ ├── contexts/
│ │ ├── context-combiner.tsx
│ │ ├── context-global.tsx
│ │ └── context-product.ts
│ ├── services/
│ │ └── product-service.ts
│ └── App.tsx
├── package.json
└── ...
O projeto utiliza uma estrutura modular para o estado global, permitindo integração e expansão de contextos adicionais com facilidade.
// context-product.ts
export const ProductCountContext = createContext<...>(...);
// context-global.tsx
export function GlobalProvider({ providers, children }): ... {
...
}
O App.tsx
serve como o coração da aplicação, onde os estados globais são inicializados e gerenciados. Utilizamos o GlobalProvider
para envolver o aplicativo com os contextos combinados, permitindo que cada componente acesse os estados globais conforme necessário.
Exemplo do processo:
// App.tsx
import { createGlobalContextProviders } from "./contexts/context-combiner";
...
// Valores dos contextos que serão passados aos provedores combinados
const contextValues = {
productCountContext: {
productCount,
setProductCount
},
// Outros contextos podem ser adicionados aqui
};
// Criação dos provedores de contexto combinados para serem passados ao GlobalProvider
const providers = createGlobalContextProviders(contextValues);
return (
<GlobalProvider providers={providers}>
...
...
</GlobalProvider>
);
O componente Header
serve como uma parte crucial da interface do usuário no aplicativo DSFilter
, demonstrando uma aplicação prática da Context API
do React para acessar e exibir dados globais de estado.
O Header
é responsável por apresentar a marca do aplicativo e a contagem atual de produtos que atendem aos critérios de filtragem estabelecidos pelo usuário. Ele responde a mudanças de estado de forma reativa, garantindo que a contagem de produtos mostrada esteja sempre atualizada.
Utilizando o hook useContext
, o Header
acessa diretamente o ProductCountContext
. Este contexto mantém o estado global productCount
, que é a variável onde a contagem de produtos é armazenada. Este método elimina a necessidade de prop drilling
, simplificando o fluxo de dados na aplicação.
import './styles.css';
import { useContext } from 'react';
import { ProductCountContext } from '../../../contexts/context-product';
export default function Header() {
const { productCount } = useContext(ProductCountContext);
return (
<header className="header">
<div className="header-container">
<div className="header-brand">DSFilter</div>
<div className="header-products">
{productCount} produto(s)
</div>
</div>
</header>
);
}
- Atualização em Tempo Real: Sempre que a lista de produtos é alterada devido à aplicação de filtros, o
Header
reflete automaticamente a nova contagem. - Separação de Preocupações: O
Header
mantém o foco na exibição dos dados, enquanto o gerenciamento do estado é tratado separadamente pelo contexto. - Facilidade de Manutenção: Com o estado global acessível de maneira centralizada, o código fica mais fácil de entender e manter.
Através desta abordagem, o Header
exemplifica como componentes funcionais em React podem interagir de maneira eficiente com estados globais, contribuindo para uma arquitetura limpa e uma experiência de usuário altamente responsiva.
A arquitetura do DSFilter
foi projetada para ser altamente modular e escalável, utilizando a Context API
do React para gerenciar estados globais. Esta abordagem permite que diferentes aspectos do estado da aplicação sejam acessados e modificados em qualquer lugar da árvore de componentes, sem a necessidade de prop drilling
ou gerenciamento de estado complexo e propenso a erros.
Cada contexto, como o ProductCountContext
, é definido com um estado padrão e funções de atualização. Eles são responsáveis por gerenciar segmentos específicos do estado da aplicação.
O context-combiner.tsx
é responsável por agrupar múltiplos contextos. Utiliza uma função que recebe os valores atuais do estado para cada contexto e retorna uma array de providers
, cada um configurado com o seu respectivo estado e funções.
O GlobalProvider
no arquivo context-global.tsx
atua como um componente de ordem superior, recebendo um array de providers
de contexto e envolvendo os componentes filhos. Ele utiliza a função reduceRight
para aninhar cada provider, formando uma "capa" de contextos acessíveis globalmente.
Os componentes da aplicação, como Header
, podem acessar qualquer estado global diretamente através do hook useContext
, referenciando o contexto apropriado. Isso elimina a necessidade de passar props desnecessariamente por vários níveis de componentes.
- Reutilização e Separação de Preocupações: Cada contexto gerencia seu próprio estado, tornando-os reutilizáveis e focados em uma única responsabilidade.
- Facilidade de Manutenção: A adição ou alteração de um contexto não afeta os outros. O estado é centralizado mas gerenciado de forma distribuída.
- Escalabilidade: Novos contextos podem ser facilmente integrados ao sistema existente sem reescrever ou refatorar o código existente.
Responsável por armazenar e atualizar a contagem de produtos que atendem aos critérios de filtro.
// Definição do contexto com estado e função de atualização padrão.
export const ProductCountContext = createContext<ProductCountContextType>({
productCount: 0,
setProductCount: () => {},
});
Centraliza a criação dos providers de contexto, facilitando a agregação e a gestão dos estados globais em um único ponto.
// Agrega valores dos contextos e cria os providers correspondentes.
export function createGlobalContextProviders(values: CombinedContextValues) {
...
}
Um componente que utiliza a função createGlobalContextProviders
para receber um array de providers de contexto e utiliza a composição para criar um provedor global que encapsula todos os contextos fornecidos.
// Composição de provedores de contexto para envolver componentes filhos.
export function GlobalProvider({ providers, children }: GlobalProviderProps): React.ReactElement {
...
}
O DSFilter é um exemplo prático e didático que ilustra a flexibilidade e o poder da Context API
em aplicações React. A estrutura adotada aqui serve como um modelo robusto para o gerenciamento de estados globais, que pode ser adaptado e expandido conforme as necessidades do projeto crescem.