25 Jan 2023
10 min

Arquitetura de Componentes Escaláveis

Arquitetura
React
Design Patterns
Arquitetura de Componentes Escaláveis
Lucas Medeiros
Lucas Medeiros
Desenvolvedor Front-end Sênior

Desenvolver aplicações React escaláveis requer uma arquitetura de componentes bem planejada. Neste artigo, vamos explorar padrões de design e práticas que ajudam a criar componentes reutilizáveis e manuteníveis.

Padrão Compound Components

O padrão Compound Components permite criar componentes com uma API flexível e intuitiva:


      // Uso do componente
      <Select>
        <Select.Option value="option1">Opção 1</Select.Option>
        <Select.Option value="option2">Opção 2</Select.Option>
      </Select>
      
      // Implementação
      const SelectContext = React.createContext();
      
      function Select({ children, ...props }) {
        const [selectedValue, setSelectedValue] = React.useState(null); // Added React.
        
        return (
          <SelectContext.Provider value={{ selectedValue, setSelectedValue }}>
            <div {...props}>{children}</div>
          </SelectContext.Provider>
        );
      }
      
      function Option({ value, children }) {
        const { selectedValue, setSelectedValue } = React.useContext(SelectContext); // Added React.
        
        return (
          <div 
            onClick={() => setSelectedValue(value)}
            style={{ background: selectedValue === value ? 'lightblue' : 'white' }}
          >
            {children}
          </div>
        );
      }
      
      Select.Option = Option;
      

Padrão Render Props

O padrão Render Props permite compartilhar código entre componentes React usando uma prop cujo valor é uma função:


      function DataFetcher({ render, url }) {
        const [data, setData] = React.useState(null); // Added React.
        const [loading, setLoading] = React.useState(true); // Added React.
        
        React.useEffect(() => { // Added React.
          fetch(url)
            .then(response => response.json())
            .then(data => {
              setData(data);
              setLoading(false);
            });
        }, [url]);
        
        return render({ data, loading });
      }
      
      // Uso
      <DataFetcher 
        url="/api/data" 
        render={({ data, loading }) => (
          loading ? <Spinner /> : <DataDisplay data={data} />
        )}
      />
      

Componentização Atômica

A componentização atômica divide a interface em níveis de componentes:

  • Átomos: Componentes básicos como botões, inputs, etc.
  • Moléculas: Combinações de átomos que formam componentes mais complexos.
  • Organismos: Combinações de moléculas que formam seções da interface.
  • Templates: Combinações de organismos que formam layouts.
  • Páginas: Instâncias específicas de templates.

Conclusão

Adotar estes padrões de arquitetura ajuda a criar componentes React mais flexíveis, reutilizáveis e manuteníveis, facilitando o desenvolvimento de aplicações escaláveis.