10/09/2025
Una de las interacciones más fundamentales y comunes en cualquier aplicación web es la capacidad de un usuario para introducir datos en un campo de texto y que la aplicación reaccione a esa entrada al hacer clic en un botón. Ya sea para enviar un formulario de búsqueda, iniciar sesión o añadir un comentario, este patrón es omnipresente. Aunque parece simple, existen múltiples maneras de abordar esta tarea, especialmente en frameworks modernos como React. En esta guía completa, desglosaremos paso a paso cómo obtener el valor de un input al presionar un botón, explorando desde el enfoque clásico de JavaScript hasta las técnicas más eficientes y populares en React, como el uso de los hooks useState y useRef. Además, te enseñaremos un truco de diseño muy solicitado: cómo integrar visualmente un botón dentro del propio campo de entrada.

Entendiendo el Botón de Input en JavaScript
Antes de sumergirnos en los frameworks, es crucial entender los fundamentos. En HTML, un <input type="button"> crea un botón estándar. A simple vista, puede parecer idéntico a un <input type="submit">, pero su comportamiento es radicalmente diferente. Un botón de tipo "submit" está diseñado para enviar automáticamente el formulario que lo contiene. En cambio, un botón de tipo "button" no hace nada por defecto. Su propósito es actuar como un lienzo en blanco para que nosotros, los desarrolladores, le asignemos una funcionalidad específica utilizando JavaScript. Es la herramienta perfecta para desencadenar acciones personalizadas, como la que nos ocupa: leer el valor de otro campo de entrada.
El Método Clásico: JavaScript Puro
Para establecer una base sólida, veamos cómo se logra esto con JavaScript vainilla. Este método se basa en la selección de elementos del DOM (Document Object Model) y la asignación de escuchas de eventos (event listeners).
La estructura HTML sería muy sencilla:
<div> <input type="text" id="nombreInput" placeholder="Introduce tu nombre" /> <button id="miBoton">Mostrar Valor</button> </div>Y el código JavaScript para hacerlo funcionar:
document.addEventListener('DOMContentLoaded', () => { // Seleccionamos los elementos del DOM por su ID const inputElement = document.getElementById('nombreInput'); const buttonElement = document.getElementById('miBoton'); // Añadimos un 'event listener' al botón para el evento 'click' buttonElement.addEventListener('click', () => { // Al hacer clic, obtenemos el valor actual del input const valorDelInput = inputElement.value; // Hacemos algo con el valor, como mostrarlo en la consola console.log('El valor introducido es:', valorDelInput); alert('Has escrito: ' + valorDelInput); }); });Este enfoque es directo y efectivo, pero en aplicaciones complejas y basadas en componentes, como las construidas con React, manipular el DOM directamente se considera un antipatrón. Por eso, React nos ofrece herramientas más declarativas y eficientes.
Capturando el Valor en React: El Enfoque Moderno
React gestiona el estado de la aplicación de una manera mucho más organizada. Para obtener el valor de un input, tenemos principalmente dos hooks a nuestra disposición: useState y useRef. Analicemos ambos.
Método 1: Usando el Hook `useState` (Componente Controlado)
Este es el método más común y recomendado en React. La idea es que el estado de React sea la "única fuente de verdad". El valor del input no se almacena en el DOM, sino en una variable de estado del componente. Cada vez que el usuario escribe, el estado se actualiza, y el input simplemente refleja ese estado. A esto se le llama un componente controlado.
Veamos el código:
import React, { useState } from 'react'; function App() { // 1. Definimos una variable de estado 'nombre' para almacenar el valor del input. const [nombre, setNombre] = useState(''); // 2. Creamos una función que se ejecutará cada vez que el input cambie. const handleInputChange = (event) => { // Actualizamos el estado 'nombre' con el valor actual del input. setNombre(event.target.value); }; // 3. Creamos una función que se ejecutará al hacer clic en el botón. const handleBtnClick = () => { // Accedemos al valor directamente desde nuestra variable de estado. console.log('El valor desde el estado es:', nombre); alert('Hola, ' + nombre); }; return ( <div> <input type="text" placeholder="Introduce tu nombre" value={nombre} // El valor del input está ligado al estado. onChange={handleInputChange} // La función se ejecuta en cada cambio. /> <button onClick={handleBtnClick}>Mostrar Valor</button> </div> ); } export default App;En este ejemplo, el flujo es claro: el usuario escribe, el evento onChange se dispara, la función handleInputChange actualiza el estado con setNombre, y React vuelve a renderizar el componente con el nuevo valor en el input. Al hacer clic en el botón, handleBtnClick simplemente lee el valor más reciente de la variable de estado nombre.
Método 2: Usando el Hook `useRef` (Acceso Directo al DOM)
Una alternativa es usar el hook useRef. Una `ref` en React es como un puntero directo a un elemento del DOM. En lugar de controlar el valor a través del estado, dejamos que el input maneje su propio estado internamente (convirtiéndolo en un "componente no controlado") y solo leemos su valor cuando lo necesitamos.
El código sería así:
import React, { useRef } from 'react'; function App() { // 1. Inicializamos una ref con valor null. const inputRef = useRef(null); // 2. Creamos la función para el clic del botón. const handleBtnClick = () => { // Accedemos al nodo del DOM a través de 'inputRef.current' // y luego a su propiedad 'value'. console.log('El valor desde la ref es:', inputRef.current.value); alert('Has introducido: ' + inputRef.current.value); }; return ( <div> {/* 2. Asociamos la ref al elemento input. */} <input type="text" ref={inputRef} placeholder="Introduce tu nombre" /> <button onClick={handleBtnClick}>Mostrar Valor</button> </div> ); } export default App;Aquí, no hay estado ni función onChange. La `ref` se adjunta al input, y cuando se presiona el botón, accedemos directamente a inputRef.current.value para obtener el valor actual del DOM. Este método es útil cuando no necesitas el valor del input para nada más que una lectura puntual y quieres evitar re-renderizados innecesarios en cada pulsación de tecla.
Tabla Comparativa: `useState` vs. `useRef`
Para ayudarte a decidir qué método usar, aquí tienes una tabla comparativa:
| Característica | useState (Componente Controlado) | useRef (Componente No Controlado) |
|---|---|---|
| Flujo de Datos | Unidireccional. El estado de React controla el valor del input. | El DOM maneja el estado del input. React solo lo lee cuando es necesario. |
| Re-renderizado | El componente se re-renderiza con cada cambio en el input (cada pulsación de tecla). | No causa re-renderizados al escribir en el input. |
| Caso de Uso Principal | Validación en tiempo real, campos de búsqueda dinámicos, formateo de datos mientras se escribe. | Obtener valores de formularios una única vez al enviarlos, integración con librerías de terceros que manipulan el DOM. |
| Complejidad | Ligeramente más verboso (requiere estado y manejador de cambio). | Más simple para casos de solo lectura. |
Diseño Avanzado: Integrar un Botón Dentro de un Campo de Input
Una técnica de diseño muy popular es hacer que un botón (como uno para limpiar el campo o para buscar) aparezca dentro del propio campo de texto. Esto no se puede lograr anidando un <button> dentro de un <input>, ya que la etiqueta <input> es auto-cerrada. La solución reside en un ingenioso truco de HTML y CSS.

La Estructura HTML
Envolvemos tanto el input como el botón en un contenedor común, que será nuestro punto de referencia para el posicionamiento.
<div class="input-container"> <input type="text" id="textInput" placeholder="Escribe algo..." /> <button id="clearButton">Limpiar</button> </div>El Estilo CSS
La magia ocurre aquí. Hacemos que el contenedor tenga una posición relativa para que el botón, con posición absoluta, se coloque con respecto a él.
.input-container { position: relative; width: 100%; max-width: 350px; } #textInput { width: 100%; padding: 12px; /* Dejamos espacio a la derecha para el botón */ padding-right: 80px; box-sizing: border-box; /* Importante para que el padding no aumente el ancho total */ border: 1px solid #ccc; border-radius: 5px; } #clearButton { /* Posicionamos el botón absolutamente dentro del contenedor */ position: absolute; top: 50%; right: 10px; /* Truco para centrar verticalmente el botón */ transform: translateY(-50%); background-color: #e74c3c; color: white; border: none; cursor: pointer; padding: 6px 12px; border-radius: 5px; } #clearButton:hover { background-color: #c0392b; }Con este CSS, el botón se superpone visualmente en el extremo derecho del campo de texto. El padding-right en el input es crucial para evitar que el texto que escribe el usuario quede oculto debajo del botón.
La Funcionalidad con JavaScript
Finalmente, hacemos que el botón "Limpiar" realmente limpie el texto.
document.getElementById('clearButton').addEventListener('click', function() { document.getElementById('textInput').value = ''; });Si estuvieras en React usando el método de `useState`, la función del botón simplemente llamaría a `setNombre('')` para vaciar el estado y, por ende, el input.
Preguntas Frecuentes (FAQ)
¿Es mejor usar `useState` o `useRef` para obtener el valor de un input?
Generalmente, se prefiere useState y el patrón de componente controlado. Te da más control sobre los datos, facilita la validación en tiempo real y se alinea mejor con la filosofía declarativa de React. Usa `useRef` solo cuando tengas una buena razón, como optimizar el rendimiento en formularios muy grandes o cuando el valor del input no afecta al renderizado de la UI.
¿Puedo poner un `` directamente dentro de una etiqueta ``?
No. La etiqueta <input> en HTML es un elemento vacío o auto-cerrado, lo que significa que no puede tener elementos hijos. La técnica correcta es usar un elemento contenedor (como un <div>) y posicionar el botón sobre el input usando CSS, como se explicó anteriormente.
¿Qué es exactamente un "componente controlado" en React?
Un componente controlado es un componente de formulario (como `input`, `textarea` o `select`) cuyo valor es controlado por el estado de React. En lugar de que el DOM maneje y almacene el valor, este se guarda en una variable de estado del componente. Cualquier cambio en el input actualiza el estado, y cualquier cambio en el estado se refleja en el valor del input. Esto crea un flujo de datos predecible y centralizado.
Si quieres conocer otros artículos parecidos a Obtener Valor de Input con un Botón: Guía Fácil puedes visitar la categoría Juegos.
