Componentes en React
Hasta ahora hemos usado JSX para crear elementos, pero la verdadera potencia de React está en los componentes. Un componente es una función de JavaScript que retorna JSX. Es como crear tus propias etiquetas HTML personalizadas y reutilizables.
¿Qué es un componente?
Un componente es simplemente una función de JavaScript que devuelve JSX:
function Saludo() {
return <h1>¡Hola desde un componente!</h1>
}
Y puedes usarlo como si fuera una etiqueta HTML:
<Saludo />
¿Por qué componentes?
- 🔄 Reutilizables - Escribe una vez, usa en cualquier lugar
- 📦 Organizados - Cada componente tiene su propia lógica
- 🧩 Componibles - Combina componentes para crear UIs complejas
- 🔧 Mantenibles - Más fácil de entender y modificar
Elemento vs Componente en React
En React, los elementos son los bloques básicos de la interfaz de usuario. Son lo que se renderizan en el DOM y son representados por etiquetas HTML.
<h1>Hola</h1>
Los componentes son funciones que retornan elementos.
function Saludar() {
return <h1>Hola</h1>
}
<Saludar />
Esa es la diferencia fundamental entre elementos y componentes.
Tu primer componente: Saludar
Vamos a crear un componente simple para entender los conceptos básicos. Actualiza tu archivo react.html:
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>React - Componentes</title>
<link rel="stylesheet" href="./styles.css" />
</head>
<body>
<div id="root"></div>
<script type="module">
import React from 'https://esm.sh/react?dev'
import ReactDOM from 'https://esm.sh/react-dom/client?dev'
window.React = React
window.ReactDOMClient = ReactDOM
</script>
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
<script type="text/babel">
// Nuestro primer componente
function Saludar() {
return <h1>¡Hola desde un componente!</h1>
}
// Renderizar el componente
window.onload = () => {
const rootEl = document.querySelector('#root')
const root = ReactDOMClient.createRoot(rootEl)
root.render(<Saludar />)
}
</script>
</body>
</html>
Props: Pasando datos a componentes
Los componentes pueden recibir props (propiedades). Es como pasar argumentos a una función:
function Saludar(props) {
return <h1>¡Hola, {props.nombre}!</h1>
}
// Usar el componente
// <Saludar nombre="Miguel" />
Destructuring de props
Es muy común usar destructuring para extraer las props directamente:
function Saludar({ nombre }) {
return <h1>¡Hola, {nombre}!</h1>
}
// uso: <Saludar nombre="Miguel" />
Esto es más limpio que escribir props.nombre cada vez.
Múltiples props
Puedes pasar tantas props como necesites:
function Saludar({ nombre, edad, ciudad }) {
return (
<div>
<h1>¡Hola, {nombre}!</h1>
<p>
Tienes {edad} años y vives en {ciudad}
</p>
</div>
)
}
// uso: <Saludar nombre="Miguel" edad={25} ciudad="Madrid" />
💡 Nota: Los valores que no son strings se pasan entre llaves:
edad={25}en lugar deedad="25".
Estilos en JSX: Un objeto JavaScript
Ahora vamos a añadir un estilo personalizado a nuestro componente. Importante: Recuerda que JSX es JavaScript, no HTML.
function Saludar({ nombre, color }) {
const estilos = {
color: color,
fontSize: '32px',
fontWeight: 'bold',
textAlign: 'center',
}
return <h1 style={estilos}>¡Hola, {nombre}!</h1>
}
<Saludar nombre="Miguel" color="#09f" />
<Saludar nombre="Ana" color="#f90" />
¿Por qué estilos como objeto?
JSX es JavaScript, no HTML. Por eso:
- ✅ Los estilos son un objeto JavaScript
- ✅ Las propiedades usan camelCase:
fontSizeen lugar defont-size - ✅ Los valores son strings:
'32px'o números:32 - ✅ Se pasan con llaves:
style={estilos}ostyle={{ color: 'red' }}
Comparación:
<!-- HTML normal -->
<h1 style="color: red; font-size: 32px">Hola</h1>
// JSX (JavaScript)
<h1 style={{ color: 'red', fontSize: '32px' }}>Hola</h1>
Estilos inline con props
Puedes pasar los estilos directamente usando el valor de las props:
function Saludar({ nombre, color }) {
return (
<h1 style={{ color: color, fontSize: '32px', textAlign: 'center' }}>
¡Hola, {nombre}!
</h1>
)
}
<Saludar nombre="Miguel" color="blue" />
<Saludar nombre="Ana" color="green" />
O incluso más corto con la notación de propiedad abreviada:
function Saludar({ nombre, color }) {
return <h1 style={{ color, fontSize: '32px' }}>¡Hola, {nombre}!</h1>
}
Cuando la propiedad del objeto tiene el mismo nombre que la variable (
color: color), puedes escribir solocolor.
Props son de solo lectura
Importante: Las props no se pueden modificar dentro de un componente. Son inmutables:
function Saludar({ nombre }) {
// ❌ No puedes hacer esto
nombre = 'Nuevo nombre' // Error!
return <h3>{nombre}</h3>
}
Las props son como los argumentos de una función: puedes leerlos pero no modificarlos. Más adelante veremos el estado para manejar datos que sí cambian.
¡Lo que hemos aprendido de los componentes!
- 🧩 Qué son los componentes - Funciones que retornan JSX
- 📦 Cómo crear componentes - Nombres con mayúscula, retornar JSX
- 🔑 Qué son las props - Datos que se pasan a los componentes
- 🎨 Estilos en JSX - Objetos JavaScript, camelCase
- 🔄 Reutilización - El mismo componente con diferentes datos
- 🏗️ Composición - Combinar componentes para crear UIs complejas
- ⚡ Ventajas sobre vanilla JS - Código más limpio y mantenible
En la próxima clase aprenderemos sobre el estado (useState), que nos permitirá crear componentes interactivos que reaccionan a eventos del usuario.
💡 Recuerda: Los componentes son funciones que retornan JSX. Las props son los datos que reciben. JSX es JavaScript, por eso los estilos son objetos.