Componentes y Composición en React
La composición es una de las técnicas fundamentales en React que permite construir interfaces de usuario complejas a partir de componentes más pequeños y reutilizables. Gracias a esta característica, React fomenta la modularidad y el mantenimiento eficiente del código.
¿Qué es la composición de componentes?
La composición en React se refiere al proceso de combinar componentes para formar interfaces más complejas. En lugar de heredar comportamiento y estilo, React utiliza la composición para pasar datos y reutilizar lógica entre componentes.
Ejemplo básico
function Header() {
return <header>Encabezado</header>;
}
function Footer() {
return <footer>Pie de página</footer>;
}
function App() {
return (
<div>
<Header />
<main>Contenido principal</main>
<Footer />
</div>
);
}Comunicación entre componentes
La comunicación entre componentes se realiza principalmente mediante props, que permiten pasar datos desde un componente padre hacia uno o más componentes hijos.
De padre a hijo (vía props)
function Greeting({ name }) {
return <h1>Hola, {name}</h1>;
}
function App() {
return <Greeting name="Juan" />;
}De hijo a padre (con callbacks)
En este caso, el componente hijo llama a una función pasada como prop desde el padre.
function Button({ onClick }) {
return <button onClick={() => onClick("Mensaje del hijo")}>Haz clic</button>;
}
function App() {
const handleClick = (message) => alert(message);
return <Button onClick={handleClick} />;
}Prop especial children
La prop children permite a los componentes envolver contenido arbitrario, lo que los hace más flexibles y reutilizables.
Ejemplo
function Card({ children }) {
return <div className="card">{children}</div>;
}
function App() {
return (
<Card>
<h1>Título de la tarjeta</h1>
<p>Contenido de la tarjeta</p>
</Card>
);
}Patrón Render Props
El patrón Render Props consiste en pasar una función como prop que devuelve elementos React. Es útil para compartir lógica entre componentes.
Ejemplo
function DataFetcher({ render }) {
const data = ["Elemento 1", "Elemento 2", "Elemento 3"];
return <div>{render(data)}</div>;
}
function App() {
return (
<DataFetcher
render={(data) => (
<ul>
{data.map((item, index) => (
<li key={index}>{item}</li>
))}
</ul>
)}
/>
);
}Componentes de Orden Superior (HOC)
Un Componente de Orden Superior (HOC, por sus siglas en inglés) es una función que toma un componente como argumento y devuelve un nuevo componente. Los HOC permiten reutilizar lógica entre múltiples componentes.
Ejemplo
function withLogger(Component) {
return function WrappedComponent(props) {
console.log("Props: ", props);
return <Component {...props} />;
};
}
function Hello({ name }) {
return <h1>Hola, {name}</h1>;
}
const HelloWithLogger = withLogger(Hello);
function App() {
return <HelloWithLogger name="Juan" />;
}Composición vs. Herencia
React fomenta la composición en lugar de la herencia para compartir código y lógica. La composición es más flexible y se alinea mejor con el diseño basado en componentes de React.
Ejemplo práctico
En lugar de usar herencia para personalizar un botón:
function Button({ children, color }) {
return <button style={{ backgroundColor: color }}>{children}</button>;
}
function App() {
return <Button color="blue">Haz clic</Button>;
}Conclusiones
La composición es una de las características clave que hace que React sea tan poderoso. Al dividir la interfaz en componentes pequeños y combinarlos de manera eficiente, puedes crear aplicaciones modulares, mantenibles y escalables. Dominar la composición te permitirá aprovechar al máximo el potencial de React.
