🚀 ¡Las clases del Bootcamp vuelven el 7 de enero con Node.js! Cargando...

Componentes vs Funciones normales

Los componentes de React son funciones de JavaScript, pero no todas las funciones de JavaScript son componentes de React. En esta clase vamos a entender cuál es la diferencia y por qué es importante.

¿Qué es un componente de React?

Un componente de React es una función especial que:

  1. Retorna algo que React puede renderizar (JSX, elementos, strings, números, null, etc.)
  2. Su nombre empieza con mayúscula (PascalCase)
  3. Se usa como una etiqueta JSX (<MiComponente />)
// ✅ Esto es un componente
function Saludo() {
  return <h1>Hola</h1>
}

// Se usa así:
// <Saludo />

¿Qué es una función normal?

Una función normal de JavaScript es cualquier función que realizas tareas pero no necesariamente retorna JSX:

// ✅ Esto es una función normal
function calcularTotal(precio, iva) {
  return precio + precio * iva
}

// Se llama como función
const total = calcularTotal(100, 0.21)

Diferencias clave

1. Cómo se invocan

Componentes: Se usan como etiquetas JSX

function Boton() {
  return <button>Haz clic</button>
}

// Se invoca así:
// <Boton />

Funciones normales: Se llaman con paréntesis

function saludar(nombre) {
  return `Hola, ${nombre}`
}

// Se invoca así:
saludar('Miguel')

2. Lo que retornan

Componentes: Retornan elementos que React puede renderizar

function Titulo() {
  return <h1>Mi título</h1> // Retorna JSX
}

Funciones normales: Retornan cualquier tipo de dato JavaScript

function sumar(a, b) {
  return a + b // Retorna un número
}

function obtenerUsuario() {
  return { nombre: 'Miguel', edad: 25 } // Retorna un objeto
}

3. Convención de nombres

Componentes: PascalCase (primera letra mayúscula)

function MiComponente() {
  return <div>Hola</div>
}

Funciones normales: camelCase (primera letra minúscula)

function calcularPrecio() {
  return 100
}

¿Qué puede renderizar React?

React puede renderizar varios tipos de valores:

✅ Elementos JSX

function App() {
  return <h1>Hola mundo</h1>
}

✅ Strings (texto)

function Saludo() {
  return 'Hola desde un componente'
}

// También puedes renderizar strings directamente
<div>{'Texto entre llaves'}</div>
<div>Texto directo</div>

✅ Números

function Contador() {
  return 42
}

// También en JSX:
<div>{100}</div>
<div>{2 + 2}</div>

null o undefined

Estos valores no renderizan nada visible, pero son válidos:

function Invisible() {
  return null // No renderiza nada
}

// Uso:
;<Invisible /> // No renderiza nada

PascalCase: ¿Por qué es importante?

Los componentes deben empezar con mayúscula. Esto no es solo una convención, es un requisito técnico de React.

¿Por qué?

React necesita distinguir entre:

  • Componentes personalizados (tus componentes)
  • Elementos HTML nativos (div, button, h1, etc.)
// React ve mayúscula = componente personalizado
<MiBoton /> // Busca un componente llamado MiBoton

// React ve minúscula = elemento HTML
<miboton /> // Renderiza un elemento HTML normal

Ejemplo práctico

// ✅ Correcto - PascalCase
function MiComponente() {
  return <div>Hola</div>
}

// uso: <MiComponente />
// React lo trata como componente

// ❌ Incorrecto - camelCase
function miComponente() {
  return <div>Hola</div>
}

// uso: <miComponente />
// React lo trata como una etiqueta HTML normal

Si usas minúscula, React pensará que es una etiqueta HTML desconocida y no funcionará correctamente.

Reglas de nomenclatura

// ✅ Correcto
function Boton() {}
function MiBoton() {}
function BotonPrimario() {}
function JobCard() {}

// ❌ Incorrecto
function boton() {} // Minúscula
function miBoton() {} // camelCase
function BOTON() {} // MAYÚSCULAS (técnicamente funciona, pero no es convención)
function boton_primario() {} // snake_case

Mezclando componentes y funciones

Es común tener funciones normales que ayudan a los componentes:

// Función normal (helper)
function formatearPrecio(precio) {
  return `${precio}`
}

// Componente que usa la función
function Producto({ nombre, precio }) {
  const precioFormateado = formatearPrecio(precio) // Llamada normal

  return (
    <div>
      <h3>{nombre}</h3>
      <p>{precioFormateado}</p>
    </div>
  )
}

// Uso del componente
// <Producto nombre="Laptop" precio={999} />

Cuándo usar cada uno

Usa componentes cuando:

  • Necesitas renderizar UI (interfaz de usuario)
  • Quieres reutilizar un trozo de interfaz
  • Necesitas componer elementos visuales
function Tarjeta({ titulo, descripcion }) {
  return (
    <div className="card">
      <h2>{titulo}</h2>
      <p>{descripcion}</p>
    </div>
  )
}

Usa funciones normales cuando:

  • Necesitas hacer cálculos o transformaciones
  • Quieres formatear datos
  • Tienes lógica de negocio que no renderiza nada
function validarEmail(email) {
  return email.includes('@')
}

function obtenerFechaActual() {
  return new Date().toLocaleDateString()
}

Errores comunes

❌ Error 1: Llamar un componente como función

function Saludo() {
  return <h1>Hola</h1>
}

// ❌ Mal
const resultado = Saludo() // No hagas esto

// ✅ Bien
<Saludo /> // Usa como etiqueta

❌ Error 2: Usar minúscula para componentes

// ❌ Mal
function saludo() {
  return <h1>Hola</h1>
}

// ✅ Bien
function Saludo() {
  return <h1>Hola</h1>
}

❌ Error 3: Intentar renderizar objetos

// ❌ Mal
function Usuario() {
  return { nombre: 'Miguel', edad: 25 } // Error!
}

// ✅ Bien
function Usuario() {
  const usuario = { nombre: 'Miguel', edad: 25 }
  return (
    <div>
      {usuario.nombre} - {usuario.edad} años
    </div>
  )
}

El último repaso:

  • 🎯 Diferencia entre componentes y funciones - Cómo se usan y qué retornan
  • 🔤 Por qué PascalCase - React necesita distinguir componentes de HTML
  • 📦 Qué puede renderizar React - JSX, strings, números, null, arrays
  • ⚠️ Qué NO puede renderizar - Objetos planos
  • 🔧 Cuándo usar cada uno - Componentes para UI, funciones para lógica
  • 🚫 Errores comunes - Llamar componentes como funciones, usar minúsculas

En la próxima clase aprenderemos sobre el estado con useState, que nos permitirá crear componentes interactivos que reaccionan a las acciones del usuario.

💡 Recuerda: Los componentes son funciones especiales que retornan JSX y usan PascalCase. Las funciones normales ayudan con la lógica pero no se renderizan directamente.