¡Bienvenido, aspirante a desarrollador React! Has tomado una decisión fantástica. React es una potente y popular biblioteca de JavaScript para construir interfaces de usuario, y aprenderla es una forma segura de impulsar tus habilidades de desarrollo web. Esta guía completa, paso a paso, te llevará de cero a héroe, equipándote con el conocimiento práctico que necesitas para empezar a construir tus propias aplicaciones React en 2025. Nos centraremos en hacer, no solo en leer, ¡así que prepárate para escribir algo de código!
¿Quieres una plataforma integrada y todo en uno para que tu equipo de desarrolladores trabaje junto con máxima productividad?
¡Apidog cumple todas tus demandas y reemplaza a Postman a un precio mucho más asequible!
Configuremos tu Entorno de Desarrollo React
Antes de que podamos empezar a construir interfaces de usuario increíbles, necesitamos configurar un lugar para trabajar. Piensa en esto como preparar tu taller antes de empezar un nuevo proyecto.
Instalando lo Esencial: Node.js y npm
Las aplicaciones React se construyen y gestionan usando Node.js y su gestor de paquetes, npm (Node Package Manager).
- Node.js: Es un entorno de ejecución de JavaScript que te permite ejecutar código JavaScript fuera de un navegador web.
- npm: Es un registro masivo de paquetes de software que puedes instalar y usar fácilmente en tus proyectos.
Para empezar, dirígete al sitio web oficial de Node.js y descarga la última versión de Soporte a Largo Plazo (LTS). El instalador es sencillo; solo sigue las instrucciones en pantalla. Una vez instalado, tendrás tanto Node.js como npm listos. Puedes verificar la instalación abriendo tu terminal o línea de comandos y escribiendo:Bash
node -v
npm -v
Estos comandos deberían imprimir las versiones de Node.js y npm que tienes instaladas, respectivamente.
Tu Primer Proyecto React con Vite
En el pasado, create-react-app
era la herramienta de referencia para iniciar un nuevo proyecto React. Sin embargo, el panorama del desarrollo web moderno avanza rápido, y en 2025, Vite es la opción recomendada por su increíble velocidad y eficiencia.
Para crear un nuevo proyecto React con Vite, abre tu terminal y ejecuta el siguiente comando:Bash
npm create vite@latest my-first-react-app -- --template react
Analicemos este comando:
npm create vite@latest
: Este comando usa npm para ejecutar la última versión del paquetecreate-vite
.my-first-react-app
: Este es el nombre de la carpeta de tu proyecto. Puedes cambiarlo por lo que quieras.-- --template react
: Esto le dice a Vite que queremos crear un proyecto con la plantilla de React.
Una vez que el comando termine, tendrás un nuevo directorio con el nombre de tu proyecto. Navega a este directorio:Bash
cd my-first-react-app
Luego, necesitas instalar las dependencias del proyecto. Estos son los otros paquetes que tu aplicación React necesita para funcionar correctamente. Ejecuta este comando:Bash
npm install
Finalmente, para ver tu flamante aplicación React en acción, inicia el servidor de desarrollo:Bash
npm run dev
Tu terminal mostrará una URL local, generalmente http://localhost:5173
. Abre esta URL en tu navegador web y verás la aplicación React predeterminada creada por Vite. ¡Felicidades, acabas de configurar tu primer proyecto React!
El Corazón de React: Componentes y JSX
Ahora que tienes una aplicación React en funcionamiento, profundicemos en los conceptos centrales que hacen que React sea tan poderoso: los componentes y JSX.
¿Qué son los Componentes?
En esencia, una aplicación React es una colección de piezas de interfaz de usuario reutilizables y autocontenidas llamadas componentes. Piensa en una página web como si estuviera construida con bloques de LEGO. Cada bloque es un componente, y puedes combinarlos para crear estructuras más complejas.
En tu proyecto my-first-react-app
, abre la carpeta src
y encontrarás un archivo llamado App.jsx
. Este es el componente principal de tu aplicación. Simplifiquemos su contenido para entender lo básico:JavaScript
// src/App.jsx
function App() {
return (
<div>
<h1>Hello, React World!</h1>
<p>This is my very first React component.</p>
</div>
);
}
export default App;
En este código:
- Definimos una función de JavaScript llamada
App
. Este es un componente funcional, que es la forma moderna y recomendada de crear componentes en React. - Esta función
retorna
lo que parece HTML. Esto es JSX. - Finalmente,
export default App
para que otras partes de nuestra aplicación puedan usar este componente.
Entendiendo JSX: JavaScript XML
JSX es una extensión de sintaxis para JavaScript que te permite escribir código similar a HTML dentro1 de tus archivos JavaScript. No es realmente HTML, pero hace que escribir código de interfaz de usuario sea mucho más intuitivo y legible.
Detrás de escena, una herramienta llamada transpilador (en nuestro caso, impulsada por Vite) convierte este JSX en JavaScript regular que los navegadores pueden entender.
Modifiquemos nuestro App.jsx
para ver el poder de JSX. Podemos incrustar expresiones de JavaScript directamente dentro de nuestro JSX usando llaves {}
.JavaScript
// src/App.jsx
function App() {
const name = "Beginner Developer";
const year = new Date().getFullYear();
return (
<div>
<h1>Hello, {name}!</h1>
<p>Welcome to your React journey in {year}.</p>
</div>
);
}
export default App;
Guarda el archivo y tu navegador se actualizará automáticamente para mostrar el nuevo contenido. Esta es una característica de Vite llamada Hot Module Replacement (HMR), y proporciona una fantástica experiencia de desarrollo.
Creando tu Primer Componente Personalizado
Creemos nuestro propio componente. En la carpeta src
, crea un nuevo archivo llamado Greeting.jsx
.JavaScript
// src/Greeting.jsx
function Greeting() {
return (
<h2>This is a greeting from my custom component!</h2>
);
}
export default Greeting;
Ahora, usemos este nuevo componente Greeting
dentro de nuestro componente App.jsx
.JavaScript
// src/App.jsx
import Greeting from './Greeting'; // Importa el componente Greeting
function App() {
const name = "Beginner Developer";
const year = new Date().getFullYear();
return (
<div>
<h1>Hello, {name}!</h1>
<p>Welcome to your React journey in {year}.</p>
<Greeting /> {/* Usa el componente Greeting */}
</div>
);
}
export default App;
Al importar y luego usar <Greeting />
como si fuera una etiqueta HTML regular, hemos compuesto nuestra interfaz de usuario a partir de múltiples componentes. Este es el bloque de construcción fundamental de las aplicaciones React.
Pasando Datos con Props
Nuestro componente Greeting
es un poco estático. ¿Qué pasa si queremos saludar a diferentes personas? Aquí es donde entran las props (abreviatura de propiedades). Las props son la forma en que pasas datos de un componente padre a un componente hijo.
Haciendo Componentes Dinámicos con Props
Modifiquemos nuestro Greeting.jsx
para que acepte una prop name
.JavaScript
// src/Greeting.jsx
function Greeting(props) {
return (
<h2>Hello, {props.name}! This is a greeting from my custom component.</h2>
);
}
export default Greeting;
Ahora, en App.jsx, podemos pasar una prop name a nuestros componentes Greeting.
JavaScript
// src/App.jsx
import Greeting from './Greeting';
function App() {
return (
<div>
<Greeting name="Alice" />
<Greeting name="Bob" />
<Greeting name="Charlie" />
</div>
);
}
export default App;
Ahora verás tres saludos diferentes, cada uno con un nombre único. Las props nos permiten reutilizar componentes con datos diferentes, haciendo nuestra interfaz de usuario increíblemente flexible.
Una práctica común y moderna de JavaScript es desestructurar el objeto props
directamente en la lista de parámetros de la función. Refactoricemos Greeting.jsx
:JavaScript
// src/Greeting.jsx
function Greeting({ name }) {
return (
<h2>Hello, {name}! This is a greeting from my custom component.</h2>
);
}
export default Greeting;
Esto logra el mismo resultado pero con código más limpio y conciso.
Gestionando la Memoria del Componente con State
Aunque las props son geniales para pasar datos hacia abajo en el árbol de componentes, ¿qué sucede cuando un componente necesita recordar y gestionar sus propios datos? Aquí es donde entra en juego el estado (state). El estado son datos que se gestionan dentro de un componente. Cuando el estado de un componente cambia, React volverá a renderizar automáticamente ese componente para reflejar el nuevo estado.
Presentando el Hook useState
Para gestionar el estado en componentes funcionales, usamos una función especial de React llamada Hook. El Hook más fundamental es useState
.
Construyamos un componente de contador simple para entender cómo funciona useState
. Crea un nuevo archivo en tu carpeta src
llamado Counter.jsx
.JavaScript
// src/Counter.jsx
import { useState } from 'react';
function Counter() {
const [count, setCount] = useState(0);
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>
Click me
</button>
</div>
);
}
export default Counter;
Analicemos esto:
import { useState } from 'react';
: Importamos el HookuseState
de la biblioteca React.const [count, setCount] = useState(0);
: Este es el núcleo del HookuseState
.- Llamamos a
useState
con un valor inicial de0
. Este es el valor de inicio de nuestro estado. useState
devuelve un array con dos elementos, que estamos desestructurando:
count
: El valor actual del estado.setCount
: Una función que podemos usar para actualizar el estadocount
.
<p>You clicked {count} times</p>
: Mostramos el valor actual del estadocount
.<button onClick={() => setCount(count + 1)}>
: Cuando se hace clic en el botón, llamamos a la funciónsetCount
con el nuevo valor (count + 1
). Esto le dice a React que actualice el estado.
Ahora, agreguemos este componente Counter
a nuestro App.jsx
:JavaScript
// src/App.jsx
import Counter from './Counter';
function App() {
return (
<div>
<h1>My Awesome React App</h1>
<Counter />
</div>
);
}
export default App;
Ahora deberías ver un contador en tu navegador. Cada vez que haces clic en el botón, el número aumenta. React está volviendo a renderizar el componente Counter
cada vez que su estado cambia.
Respondiendo a Acciones del Usuario: Manejando Eventos
La interactividad es el corazón de las aplicaciones web modernas. React proporciona una forma simple y consistente de manejar eventos como clics, envíos de formularios y entrada de teclado.
Ya hemos visto un manejador de eventos básico en nuestro componente Counter
con onClick
. Exploremos esto más a fondo construyendo un formulario simple que tome la entrada del usuario.
Crea un nuevo archivo de componente llamado NameForm.jsx
.JavaScript
// src/NameForm.jsx
import { useState } from 'react';
function NameForm() {
const [name, setName] = useState('');
const handleSubmit = (event) => {
event.preventDefault(); // Evita el comportamiento predeterminado de envío del formulario
alert(`Hello, ${name}!`);
};
return (
<form onSubmit={handleSubmit}>
<label>
Name:
<input
type="text"
value={name}
onChange={(event) => setName(event.target.value)}
/>
</label>
<button type="submit">Submit</button>
</form>
);
}
export default NameForm;
Analicemos este componente de formulario:
- Tenemos una variable de estado
name
para almacenar el valor del campo de entrada. - El elemento
input
tiene un atributovalue
establecido en nuestro estadoname
. Esto lo convierte en un componente controlado, donde React tiene el control del valor de la entrada. - El manejador de eventos
onChange
se llama cada vez que el usuario escribe en el campo de entrada. Actualiza el estadoname
con el nuevo valor deevent.target.value
. - El
form
tiene un manejador de eventosonSubmit
que llama a nuestra funciónhandleSubmit
cuando se envía el formulario. - En
handleSubmit
, llamamos aevent.preventDefault()
para evitar que el navegador recargue la página, que es el comportamiento predeterminado para los envíos de formularios. Luego, mostramos una alerta con el nombre del usuario.
Agrega este NameForm
a tu App.jsx
para verlo en acción.
Mostrando Información: Renderizado Condicional y Listas
Las aplicaciones del mundo real a menudo necesitan mostrar u ocultar contenido basado en ciertas condiciones, y frecuentemente necesitan mostrar listas de datos.
Mostrando y Ocultando con Renderizado Condicional
Creemos un componente que muestre un mensaje diferente dependiendo de si un usuario ha iniciado sesión. Crea un archivo llamado LoginMessage.jsx
.JavaScript
// src/LoginMessage.jsx
function LoginMessage({ isLoggedIn }) {
if (isLoggedIn) {
return <h2>Welcome back!</h2>;
}
return <h2>Please log in.</h2>;
}
export default LoginMessage;
También podemos usar el operador ternario para un renderizado condicional más conciso.JavaScript
// src/LoginMessage.jsx
function LoginMessage({ isLoggedIn }) {
return (
<div>
{isLoggedIn ? <h2>Welcome back!</h2> : <h2>Please log in.</h2>}
</div>
);
}
export default LoginMessage;
Luego puedes usar este componente en App.jsx
y pasar la prop isLoggedIn
para ver los diferentes mensajes.
Mostrando Listas de Datos
Para renderizar una lista de elementos, normalmente usarás el método de array map()
. Creemos un componente para mostrar una lista de frutas. Crea un archivo llamado FruitList.jsx
.JavaScript
// src/FruitList.jsx
function FruitList() {
const fruits = ['Apple', 'Banana', 'Cherry', 'Date'];
return (
<div>
<h3>My Favorite Fruits:</h3>
<ul>
{fruits.map((fruit, index) => (
<li key={index}>{fruit}</li>
))}
</ul>
</div>
);
}
export default FruitList;
Aquí, estamos mapeando sobre el array fruits
y para cada fruta, estamos retornando un elemento <li>
.
Notarás la prop key={index}
. Cuando renderizas una lista de elementos, React necesita una key
única para cada elemento para actualizar la lista eficientemente cuando cambia. Usar el índice del array como clave es aceptable para listas simples y estáticas. Sin embargo, para listas dinámicas donde se pueden agregar, eliminar o reordenar elementos, es mejor usar un ID único de tus datos si está disponible.
Agregando Estilo a tu Aplicación
Una gran aplicación necesita verse bien. Hay varias formas de estilizar tus componentes React.
Hojas de Estilo CSS
La forma más sencilla es usar archivos CSS regulares. En la carpeta src
, encontrarás un archivo App.css
. Puedes agregar tus estilos allí.
Por ejemplo, para estilizar nuestro componente FruitList
, podrías agregar esto a App.css
:CSS
/* src/App.css */
.fruit-list {
list-style-type: none;
padding: 0;
}
.fruit-item {
background-color: #f0f0f0;
margin: 5px 0;
padding: 10px;
border-radius: 5px;
}
Luego, en tu FruitList.jsx
, puedes usar estas clases CSS.JavaScript
// src/FruitList.jsx
import './App.css'; // Asegúrate de importar el archivo CSS
function FruitList() {
const fruits = ['Apple', 'Banana', 'Cherry', 'Date'];
return (
<div>
<h3>My Favorite Fruits:</h3>
<ul className="fruit-list">
{fruits.map((fruit, index) => (
<li key={index} className="fruit-item">{fruit}</li>
))}
</ul>
</div>
);
}
export default FruitList;
Observa que usamos className
en lugar de class
en JSX, ya que class
es una palabra clave reservada en JavaScript.
Módulos CSS
Para aplicaciones más grandes, los Módulos CSS ofrecen una forma de delimitar los estilos a un componente específico, evitando conflictos de estilo. Un archivo de Módulo CSS se nombra con una extensión .module.css
.
Creemos FruitList.module.css
:CSS
/* src/FruitList.module.css */
.list {
list-style-type: square;
}
.item {
color: blue;
}
Ahora, en FruitList.jsx
, importas los estilos como un objeto:JavaScript
// src/FruitList.jsx
import styles from './FruitList.module.css';
function FruitList() {
const fruits = ['Apple', 'Banana', 'Cherry', 'Date'];
return (
<div>
<h3>My Favorite Fruits (Styled with CSS Modules):</h3>
<ul className={styles.list}>
{fruits.map((fruit, index) => (
<li key={index} className={styles.item}>{fruit}</li>
))}
</ul>
</div>
);
}
export default FruitList;
Vite generará automáticamente nombres de clase únicos, asegurando que los estilos en FruitList.module.css
solo se apliquen al componente FruitList
.
Navegando por tu Aplicación con React Router
La mayoría de las aplicaciones web tienen múltiples páginas. Para manejar la navegación entre estas "páginas" en una aplicación de una sola página (SPA) como una construida con React, usamos una biblioteca llamada React Router.
Configurando React Router
Primero, necesitas instalar React Router:Bash
npm install react-router-dom
Creando tus Páginas
Creemos dos componentes de página simples: HomePage.jsx
y AboutPage.jsx
.JavaScript
// src/HomePage.jsx
function HomePage() {
return (
<div>
<h1>Home Page</h1>
<p>Welcome to the home page of our amazing app!</p>
</div>
);
}
export default HomePage;
JavaScript
// src/AboutPage.jsx
function AboutPage() {
return (
<div>
<h1>About Page</h1>
<p>This is all about our incredible application.</p>
</div>
);
}
export default AboutPage;
Configurando el Router
Ahora, configuraremos nuestras rutas en App.jsx
.JavaScript
// src/App.jsx
import { BrowserRouter as Router, Routes, Route, Link } from 'react-router-dom';
import HomePage from './HomePage';
import AboutPage from './AboutPage';
function App() {
return (
<Router>
<div>
<nav>
<ul>
<li>
<Link to="/">Home</Link>
</li>
<li>
<Link to="/about">About</Link>
</li>
</ul>
</nav>
<hr />
<Routes>
<Route path="/" element={<HomePage />} />
<Route path="/about" element={<AboutPage />} />
</Routes>
</div>
</Router>
);
}
export default App;
Analicemos los nuevos componentes de React Router:
<Router>
(comoBrowserRouter
): Este componente envuelve toda tu aplicación y habilita el enrutamiento.<Link>
: Se utiliza para crear enlaces de navegación. Es similar a una etiqueta<a>
pero es consciente del router.<Routes>
: Este componente envuelve tus rutas individuales.<Route>
: Este componente define un mapeo entre una ruta URL y un componente a renderizar.
Ahora, cuando hagas clic en los enlaces "Home" y "About", el contenido cambiará sin una recarga completa de la página. ¡Has implementado con éxito el enrutamiento del lado del cliente!
Yendo Más Allá: El Hook useEffect
El Hook useState
es para gestionar el estado que afecta directamente lo que se renderiza. Pero, ¿qué pasa con los efectos secundarios, como obtener datos de una API, configurar suscripciones o cambiar manualmente el DOM? Para esto, usamos el Hook useEffect
.
El Hook useEffect
se ejecuta después de cada renderizado por defecto. Veámoslo en acción creando un componente que obtiene datos de una API falsa.
Crea un nuevo archivo DataFetcher.jsx
.JavaScript
// src/DataFetcher.jsx
import { useState, useEffect } from 'react';
function DataFetcher() {
const [data, setData] = useState(null);
const [loading, setLoading] = useState(true);
useEffect(() => {
// Esta función se llamará después de que el componente se renderice
const fetchData = async () => {
try {
const response = await fetch('https://jsonplaceholder.typicode.com/posts/1');
const jsonData = await response.json();
setData(jsonData);
} catch (error) {
console.error('Error fetching data:', error);
} finally {
setLoading(false);
}
};
fetchData();
}, []); // ¡El array de dependencias vacío es importante!
if (loading) {
return <p>Loading...</p>;
}
return (
<div>
<h3>Fetched Data:</h3>
<h4>{data.title}</h4>
<p>{data.body}</p>
</div>
);
}
export default DataFetcher;
La clave para entender useEffect
aquí es el segundo argumento: el array de dependencias.
- Si no proporcionas un array de dependencias, el efecto se ejecutará después de cada renderizado.
- Si proporcionas un array vacío
[]
, el efecto se ejecutará solo una vez después del renderizado inicial. Esto es perfecto para obtener datos una sola vez. - Si proporcionas valores en el array
[prop, state]
, el efecto se ejecutará cada vez que cualquiera de esos valores cambie.
Agrega DataFetcher
a tu App.jsx
para verlo obtener y mostrar datos cuando el componente se carga.
Conclusión y Próximos Pasos
¡Has avanzado mucho! Has aprendido a:
- Configurar un entorno de desarrollo React moderno con Vite.
- Crear componentes funcionales y escribir UI con JSX.
- Pasar datos entre componentes usando props.
- Gestionar el estado a nivel de componente con el Hook
useState
. - Manejar eventos de usuario.
- Renderizar contenido condicionalmente y en listas.
- Estilizar tus componentes con CSS y Módulos CSS.
- Implementar enrutamiento del lado del cliente con React Router.
- Manejar efectos secundarios con el Hook
useEffect
.
Este es un logro enorme, y ahora tienes una base sólida sobre la cual construir. El mundo de React es vasto y emocionante. Aquí tienes algunos temas que quizás quieras explorar a continuación:
- Más Hooks: Profundiza en otros Hooks integrados como
useContext
,useReducer
,useCallback
yuseMemo
. - Bibliotecas de Gestión de Estado: Para aplicaciones más grandes, podrías necesitar una solución de gestión de estado más robusta como Redux, Zustand o Recoil.
- Frameworks de React: Explora frameworks construidos sobre React como Next.js para renderizado del lado del servidor y capacidades full-stack.
- Pruebas: Aprende a probar tus componentes React usando bibliotecas como Jest y React Testing Library.
Lo más importante que puedes hacer ahora es seguir construyendo. La práctica es clave. Intenta recrear un sitio web o aplicación simple que uses a diario. Desafíate con nuevas características. Cuanto más codifiques, más confianza y habilidad ganarás.
Bienvenido a la comunidad de React. ¡Feliz codificación!
¿Quieres una plataforma integrada y todo en uno para que tu equipo de desarrolladores trabaje junto con máxima productividad?
¡Apidog cumple todas tus demandas y reemplaza a Postman a un precio mucho más asequible!