Tutorial paso a paso para construir una calculadora funcional usando React y JavaScript
¡Hola desarrolladores entusiastas! Si estás comenzando en el mundo del desarrollo frontend y quieres aprender a construir una calculadora con JavaScript usando React, este tutorial es para ti. Aquí te guiaré paso a paso, desde la configuración del entorno con Create React App, hasta la creación de componentes reutilizables, manejo de estado con hooks, implementación de operaciones básicas y el diseño con CSS.
Este tutorial está pensado para principiantes en programación React, así que no te preocupes si no tienes mucha experiencia. ¡Vamos! 🚀
¿Por qué usar React para construir una calculadora?
React es una biblioteca JavaScript que facilita la creación de interfaces de usuario reactivas y escalables. Construir una calculadora es un ejercicio clásico que te permite practicar lo básico de React, como componentes, estado y eventos.
Además, te prepara para proyectos más grandes en desarrollo frontend React.
1. Configuración del entorno con Create React App
Para comenzar a trabajar con React de manera sencilla y rápida, usaremos la herramienta oficial Create React App.
Paso 1: Asegúrate de tener Node.js y npm instalados
Puedes descargar Node.js (que incluye npm) desde nodejs.org. Para verificar si ya lo tienes instalado:
1 2 3 |
node -v npm -v |
Paso 2: Crear el proyecto
En tu terminal, ejecuta:
1 2 |
npx create-react-app calculadora-react |
Esto creará una carpeta llamada calculadora-react
con todo el entorno configurado.
Paso 3: Entrar al proyecto y arrancar el servidor
1 2 3 |
cd calculadora-react npm start |
Esto abrirá tu aplicación React en el navegador, típicamente en http://localhost:3000
.
¡Listo para empezar a programar nuestra calculadora!
2. Estructura del proyecto y creación de componentes reutilizables
Vamos a construir nuestra calculadora dividiéndola en componentes simples y reutilizables:
- Display: Muestra el número actual o resultado.
- Button: Botón reutilizable para números y operaciones.
- Calculator: Componente principal que junta todo.
Crear carpeta para componentes
Dentro de src
, crea una carpeta llamada components
donde pondremos nuestros archivos.
3. Componente Button
Crea un archivo Button.js
dentro de src/components
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
import React from 'react'; import './Button.css'; // Componente Button reutilizable const Button = ({ value, onClick, className }) => { return ( <button className={`button ${className}`} onClick={() => onClick(value)}> {value} </button> ); }; export default Button; |
Explicación:
- Recibe
value
,onClick
(función a ejecutar al hacer clic) yclassName
para estilos condicionales. - Al hacer clic, llama a
onClick
con el valor del botón.
Diseño básico para Button
Crea Button.css
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
.button { font-size: 1.5rem; padding: 20px; margin: 5px; border-radius: 8px; border: none; cursor: pointer; background-color: #f0f0f0; transition: background-color 0.3s ease; } .button:hover { background-color: #d9d9d9; } .button.operator { background-color: #81b29a; color: white; } .button.operator:hover { background-color: #688a7e; } |
4. Componente Display
Crea Display.js
en src/components
:
1 2 3 4 5 6 7 8 9 |
import React from 'react'; import './Display.css'; const Display = ({ value }) => { return <div className="display">{value}</div>; }; export default Display; |
CSS para Display: Display.css
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
.display { background-color: #22223b; color: #f2e9e4; font-size: 2.5rem; padding: 20px; border-radius: 10px; text-align: right; margin-bottom: 10px; min-height: 60px; user-select: none; overflow-x: auto; white-space: nowrap; } |
El display mostrará el texto que le pasemos como prop.
5. Componente Calculator: lógica y estado con hooks
En src/components/Calculator.js
creemos el componente principal. Aquí usaremos el hook useState
para controlar la entrada y resultado.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
import React, { useState } from 'react'; import Button from './Button'; import Display from './Display'; import './Calculator.css'; const Calculator = () => { // Estado para la entrada y cálculo const [input, setInput] = useState(''); // Función para manejar clicks en botones const handleClick = (value) => { if (value === 'C') { setInput(''); // Limpiar entrada return; } if (value === '=') { try { // Evaluar la expresión con eval (cuidado en apps reales) // Aquí es seguro porque solo permitimos inputs controlados // eslint-disable-next-line no-eval const result = eval(input); setInput(String(result)); } catch (error) { setInput('Error'); } return; } // Para evitar entradas inválidas como operadores seguidos const operators = ['+', '-', '*', '/']; const lastChar = input[input.length - 1]; if ( operators.includes(value) && (input === '' || operators.includes(lastChar)) ) { // No permitir operador si input vacío o último caracter es operador return; } setInput(input + value); }; return ( <div className="calculator"> <Display value={input || '0'} /> <div className="buttons"> {/* Números y puntos */} {[ '7', '8', '9', '4', '5', '6', '1', '2', '3', '0', '.' ].map(num => ( <Button key={num} value={num} onClick={handleClick} /> ))} {/* Operadores */} <Button value="+" onClick={handleClick} className="operator" /> <Button value="-" onClick={handleClick} className="operator" /> <Button value="*" onClick={handleClick} className="operator" /> <Button value="/" onClick={handleClick} className="operator" /> {/* Otros botones */} <Button value="C" onClick={handleClick} className="operator" /> <Button value="=" onClick={handleClick} className="operator" /> </div> </div> ); }; export default Calculator; |
Explicación paso a paso:
- Estado
input
: almacena la cadena que representa la operación que el usuario escribe. handleClick
: función que actualizainput
según el botón presionado.- Si es “C”, resetea el input.
- Si es “=”, evalúa la expresión y muestra el resultado.
- Evita entradas inválidas: no permite que se ingresen operadores consecutivos o al principio.
- Usamos
eval()
para evaluar la expresión calculadora. (Nota: Evitar usar eval en apps sensibles.)
CSS para Calculator (Calculator.css
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
.calculator { max-width: 400px; margin: 40px auto; background-color: #f4f1de; padding: 20px; border-radius: 15px; box-shadow: 0 4px 10px rgb(0 0 0 / 0.2); } .buttons { display: grid; grid-template-columns: repeat(4, 1fr); gap: 10px; } |
6. Integrando el componente Calculator en la app
Edita el archivo src/App.js
para mostrar la calculadora:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
import React from 'react'; import Calculator from './components/Calculator'; import './App.css'; function App() { return ( <div className="App"> <h1>Calculadora React 👩💻📱</h1> <Calculator /> </div> ); } export default App; |
Y agrega un poco de estilo en src/App.css
:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
.App { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; text-align: center; background-color: #e0fbfc; min-height: 100vh; padding: 20px; } h1 { color: #3d5a80; margin-bottom: 20px; } |
7. ¡Probemos nuestra calculadora!
Con npm start
ejecutando el proyecto, deberías ver:
- Una pantalla para mostrar números y resultados.
- Botones numéricos y de operadores.
- Funcionalidad para sumar, restar, multiplicar, dividir.
- Botón “C” para limpiar, “=” para obtener resultados.
¿Qué más podemos mejorar?
- Manejar errores y divisiones por cero.
- Añadir soporte para teclas del teclado.
- Mejorar el diseño para dispositivos móviles.
Pero para comenzar, lo que tienes es un excelente ejercicio de desarrollo frontend React.
Buenas prácticas para programación React y proyecto calculadora
- Componentes reutilizables: Evita repetir código creando componentes genéricos.
- Hooks para estado: Utiliza
useState
para controlar el estado de forma clara. - Evitar manipulación directa del DOM: React se encarga de actualizar el DOM de forma eficiente.
- Separar estilos: Usa archivos CSS o módulos para mantener claro el estilo de cada componente.
- Validar entrada: En interfaces interactivas, siempre valida para evitar errores.
Conclusión y siguiente paso
¡Felicidades! 🎉 Has construido una calculadora funcional con React y JavaScript, entendiendo desde la configuración del entorno, creación de componentes, manejo de estado con hooks y diseño con CSS.
Este proyecto es una base increíble para tu aprendizaje en desarrollo frontend React. Te animo a mejorar esta calculadora:
- Añade funciones avanzadas como raíz cuadrada, porcentaje, memoria.
- Implementa control del teclado para mejor experiencia.
- Refactoriza el código para mejorar manejo de errores.
¿Listo para seguir aprendiendo?
Explora más tutoriales React, crea proyectos propios y participa en la comunidad. La programación React para principiantes es solo el comienzo de un viaje fascinante.
¡Manos a la obra! Comparte tu proyecto, comenta tus dudas y sigue creciendo.
Esperamos que este tutorial React te haya motivado y facilitado tus primeros pasos en React y JavaScript.