Componentes en React


Aprenderás a crear Componentes en React y a como estructurarlos en un proyecto

Componentes en React
oscar Escrito por oscar 20 April 2025 168 0

En este post exploraremos uno de los temas principales de react que son los componentes, no guiaremos de la documentación oficial https://es.react.dev/learn#components para entender los conceptos básicos y como aplicarlos a react.

Prerrequisitos

  • Instalación react se explica a detalle como instar y configurar un entono de trabajo para react
  • Estructura de un proyecto React    Conocer los archivos principales, index.js, App.js, carpetas, etc.
  • JSX  Sintaxis básica, reglas JSX, expresiones, fragmentos (<> </>).

¿Que es un componentes?

En React, un componente es un bloque de construcción reutilizable que forma la interfaz de usuario. Son como funciones de JavaScript que pueden tomar entradas (props) y devolver elementos React que describen la vista. Los componentes pueden ser funcionales o basados en clases. 

Las aplicaciones de React están hechas a partir de componentes y la organización de los componentes en un proyecto React depende del tamaño, la complejidad, y las necesidades del proyecto. 

Componentes Funcionales:

  • Son funciones de JavaScript que devuelven JSX, que es una sintaxis para escribir código HTML dentro de JavaScript. 
  • Son más simples y recomendados para componentes pequeños o sin lógica. 

Componentes de Clase:

  • Se definen usando la clase React.Component.
  • Pueden tener un estado interno que controla cómo el componente se ve.

Propiedades (props):

  • Son argumentos que se pasan a un componente cuando se instancia.
  • React pasa todos los atributos JSX y los hijos a un componente como un objeto props.
  • Las props son de solo lectura y no deben modificarse dentro del componente. 

Ejemplo practico

Crearemos un proyecto llamado practicas-react

npm create vite@latest

Donde seleccionamos:

> npx
> create-vite
|
o  Project name:
|  practicas-react
|
o  Select a framework:
|  React
|
o  Select a variant:
|  TypeScript

Por ultimo, ejecutamos

cd practicas-react
npm install
npm run dev

Vamos a crear un directorio llamado components en el directorio src donde vamos a realizar lo siguiente

Componente boton
Componente boton

Crearemos un componente llamado MyButton.tsx dentro de components

function MyButton() {
  return (
    <button>Soy un botón</button>
  );
}

Ahora que has declarado MyButton, puedes anidarlo en otro componente:

import './App.css'
import MyButton from './components/MyButton'

function App() {
  
  return (
    <div>
      <h1>Bienvenido a mi aplicación</h1>
      <MyButton />
    </div>
  )
}

export default App

Caracteristicas de lo creado anteriormente:

  • <MyButton /> empieza con mayúscula, los nombre de los componentes empiezan en mayúscula.
  • Las palabras clave export default especifican el componente principal en el archivo.
Primer componente en react
Primer componente en react

Nota: La sintaxis de marcado es JSX, JSX es más estricto que HTML. Tienes que cerrar etiquetas como <br />. Los  componente tampoco puede devolver múltiples etiquetas de JSX. Debes envolverlas en un padre compartido, como <div>...</div> o en un envoltorio vacío <>...</>:

function AboutPage() {
  return (
    <>
      <h1>Acerca de</h1>
      <p>Hola.<br />¿Cómo vas?</p>
    </>
  );
}

Añadir estilos

En React, especificas una clase de CSS con className. Funciona de la misma forma que el atributo class de HTML:

<img className="avatar" />

Luego escribes las reglas CSS para esa clase en un archivo CSS aparte:

/* In your CSS */
.avatar {
  border-radius: 50%;
}

Mostrar datos

JSX permite colocar las llaves {} para pode colocar código JavaScript y poder incrustar una variable en el código y mostrársela al usuario.

return (
  <h1>
    {user.name}
  </h1>
);

Otras formas de mostrar datos son:

return (
  <img
    className="avatar"
    src={user.imageUrl}
    alt={'Foto de ' + user.name}
  />
);

Estructura básica para componentes

Una práctica común es organizar los componentes en una carpeta llamada components/ dentro de la carpeta src/:

src/
├── components/
│   ├── Button/
│   │   ├── Button.js
│   │   ├── Button.css
│   │   └── index.js
│   ├── Header/
│   │   ├── Header.js
│   │   ├── Header.css
│   │   └── index.js
│   ├── Footer/
│   │   ├── Footer.js
│   │   ├── Footer.css
│   │   └── index.js

¿Por qué usar una carpeta por componente?

  • Separación de responsabilidades: Cada componente tiene su propio archivo JS, estilos, y pruebas, lo que facilita el mantenimiento.
  • Reutilización: Componentes bien organizados son más fáciles de buscar y reutilizar.

Componentes de diseño

Estos son los bloques básicos que no dependen de otros componentes y son reutilizables en toda la aplicación.

  • Ejemplos: Botones, cuadros de texto, etiquetas, íconos.
  • Ubicación recomendada: src/components/ui/
src/
├── components/
│   ├── ui/
│   │   ├── Button/
│   │   ├── Input/
│   │   └── Icon/

Componentes estructurales

Se usan para organizar el diseño y maquetar la aplicación.

  • Ejemplos: Header, Footer, Sidebar, Layout.
  • Ubicación recomendada: src/components/layout/
src/
├── components/
│   ├── layout/
│   │   ├── Header/
│   │   ├── Footer/
│   │   ├── Sidebar/
│   │   └── Layout/

Componentes de página

Estos representan pantallas completas de tu aplicación, como Home, Login, o Dashboard.

  • Ejemplos: Pantalla de inicio, página de perfil, panel de control.
  • Ubicación recomendada: src/pages/
src/
├── pages/
│   ├── Home/
│   │   ├── Home.js
│   │   ├── Home.css
│   │   └── index.js
│   ├── Login/
│   └── Dashboard/

Componentes específicos de una funcionalidad

Si un componente solo pertenece a una funcionalidad específica, guárdalo en una carpeta que agrupe todos los elementos relacionados con esa funcionalidad.

Ejemplo: En una aplicación de comercio electrónico, los componentes relacionados con el carrito podrían estar juntos.

src/
├── features/
│   ├── Cart/
│   │   ├── CartList/
│   │   ├── CartSummary/
│   │   └── CartItem/

Uso de index.js en carpetas de componentes

Cada carpeta de componente puede tener un archivo index.js para simplificar las importaciones.

El archivo index.js dentro de una carpeta de componente se utiliza principalmente para simplificar las importaciones y mejorar la organización del código, aunque no es estrictamente necesario.

// components/Button/index.js

export { default } from './Button';

Esto permite importar el componente de manera limpia:

import Button from './components/Button';

Estructura para proyectos grandes

Si el proyecto es grande y tiene múltiples módulos, puedes usar una estructura modular:

src/
├── components/
│   ├── ui/
│   │   ├── Button/
│   │   ├── Input/
│   │   └── Icon/
│   ├── layout/
│   │   ├── Header/
│   │   ├── Footer/
│   │   └── Sidebar/
├── features/
│   ├── Auth/
│   │   ├── LoginForm/
│   │   └── SignUpForm/
│   ├── Cart/
│   │   ├── CartList/
│   │   ├── CartSummary/
│   │   └── CartItem/
├── pages/
│   ├── Home/
│   ├── Login/
│   ├── Dashboard/

Estructura profesional del proyecto

src/
├── assets/                 # Recursos estáticos (imágenes, fuentes, íconos, etc.)
│   ├── images/
│   ├── icons/
│   └── fonts/
├── components/             # Componentes reutilizables
│   ├── Button/
│   │   ├── Button.jsx
│   │   ├── Button.module.css
│   │   └── Button.test.jsx
│   ├── Header/
│   │   ├── Header.jsx
│   │   ├── Header.module.css
│   │   └── Header.test.jsx
│   └── ...
├── hooks/                  # Hooks personalizados
│   ├── useAuth.js
│   ├── useFetch.js
│   └── ...
├── layouts/                # Diseños o layouts generales para las páginas
│   ├── MainLayout.jsx
│   ├── AdminLayout.jsx
│   └── ...
├── pages/                  # Páginas de la aplicación
│   ├── Home/
│   │   ├── Home.jsx
│   │   ├── Home.module.css
│   │   └── Home.test.jsx
│   ├── About/
│   │   ├── About.jsx
│   │   ├── About.module.css
│   │   └── About.test.jsx
│   └── ...
├── routes/                 # Definición de rutas
│   ├── AppRouter.jsx
│   └── ProtectedRoute.jsx
├── services/               # Lógica de negocio y comunicación con APIs
│   ├── api.js
│   ├── authService.js
│   ├── userService.js
│   └── ...
├── store/                  # Estado global (Redux, Zustand, etc.)
│   ├── slices/
│   │   ├── authSlice.js
│   │   ├── userSlice.js
│   │   └── ...
│   └── store.js
├── styles/                 # Estilos globales
│   ├── variables.css
│   ├── global.css
│   └── ...
├── utils/                  # Funciones y utilidades
│   ├── helpers.js
│   ├── constants.js
│   └── ...
├── index.js                # Punto de entrada de React
└── App.jsx                 # Componente raíz de la aplicación

Descripción de las carpetas y archivos

  • assets/:
    • Contiene recursos estáticos como imágenes, íconos, y fuentes que se usan globalmente en la aplicación.
  • components/:
    • Agrupa componentes reutilizables y de propósito general.
    • Cada componente tiene su propia carpeta que incluye:
    • Su archivo principal (Button.jsx).
    • Sus estilos (opcionalmente con módulos CSS como Button.module.css).
    • Pruebas unitarias (Button.test.jsx).
  • hooks/:
    • Contiene hooks personalizados (como useFetch para manejar solicitudes o useAuth para manejar autenticación).
  • layouts/:
    • Diseños comunes que agrupan páginas, como MainLayout (diseño principal) o AdminLayout (diseño para panel de administración).
  • pages/:
    • Contiene las páginas principales de la aplicación.
    • Cada página tiene su propia carpeta con:
    • Su archivo principal (Home.jsx).
    • Sus estilos específicos (Home.module.css).
    • Pruebas unitarias para el componente de página (Home.test.jsx).
  • routes/:
    • Contiene las rutas de la aplicación definidas con React Router.
    • Ejemplo: AppRouter.jsx para gestionar rutas públicas y privadas, y ProtectedRoute.jsx para proteger rutas específicas.
  • services/:
    • Contiene la lógica de negocio y los servicios para interactuar con APIs (ejemplo: autenticación, usuarios, etc.).
    • api.js: Configuración básica para solicitudes HTTP (como Axios o Fetch).
    • authService.js: Funciones relacionadas con la autenticación.
  • store/:
    • Maneja el estado global de la aplicación.
    • Incluye los slices de Redux o lógica de estado (como Zustand o Context API).
  • styles/:
    • Estilos globales como variables de CSS (variables.css) y estilos base (global.css).
  • utils/:
    • Contiene funciones utilitarias y constantes globales.
    • Ejemplo: helpers.js para funciones genéricas y constants.js para valores constantes como URLs o claves.
  • index.js:
    • Punto de entrada de la aplicación React.
    • Renderiza el componente raíz (App) en el DOM.
  • App.jsx:
    • Componente principal de la aplicación.
    • Puede incluir las rutas principales o envolverlas con un diseño base.

Comentario

Debe aceptar antes de enviar