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.
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;
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} />
)}
/>
A componentização atômica divide a interface em níveis de componentes:
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.