How to make a button appear inside the input field?

Obtener Valor de Input con un Botón: Guía Fácil

10/09/2025

Valoración: 4.82 (5799 votos)

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.

How to get input value on button click?
To get a input value on button click, define a state variable that tracks the input value and add a onChange event handler to it. Inside the event handler method update the state variable with the input value. At last add a click event handler to the button and access the input value from the react state variabale. Here is an example:
Índice de Contenido

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ísticauseState (Componente Controlado)useRef (Componente No Controlado)
Flujo de DatosUnidireccional. El estado de React controla el valor del input.El DOM maneja el estado del input. React solo lo lee cuando es necesario.
Re-renderizadoEl 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 PrincipalValidació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.
ComplejidadLigeramente 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.

What is button input in JavaScript?
The button input type creates an form button, the value of which is displayed as the text or label on the button. The button input looks identical to the submit, but they are not interchangeable — the button input does not submit the form. For the most part, the button input is used in conjunction with JavaScript.

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.

Subir