Input controlado con lista de sugerencias
Crear la base: un input controlado que muestre debajo un menú desplegable de sugerencias filtradas
Input controlado con lista de sugerencias es una lección gratuita de React Academy en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de React Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de React Academy incluye 4 lecciones en total.
Descripción general de la estructura del componente
Un componente de autocompletado tiene dos partes principales: un campo de texto controlado y una lista desplegable de sugerencias. El campo se encuentra en el flujo normal del documento y la lista desplegable se posiciona de forma absoluta justo debajo. Juntos funcionan como un único widget interactivo, aunque son elementos DOM separados.
Variables de estado necesarias
Necesita cuatro variables de estado: inputValue (string: lo que se ha escrito), suggestions (array: los elementos coincidentes actuales), isOpen (boolean: indica si la lista desplegable está visible) y selectedIndex (number: indica qué sugerencia está resaltada para la navegación con el teclado; empieza en -1 cuando no hay ninguna seleccionada).
Control del campo de entrada
Haga que el campo de entrada esté completamente controlado: value={inputValue} y onChange={e => setInputValue(e.target.value)}. Así React controla por completo el texto mostrado. Cada pulsación de tecla actualiza el estado, lo que desencadena un nuevo renderizado con el valor actualizado. No use nunca un campo de entrada no controlado para el autocompletado: necesita leer y establecer el valor mediante programación.
Filtrado desde una lista estática
Cuando las sugerencias proceden de un array local, filtre en cada renderizado según inputValue: compare cada elemento mediante item.toLowerCase().includes(inputValue.toLowerCase()). Puede calcularlo con useMemo si la lista es grande, para evitar repetir el cálculo en cada renderizado. En listas pequeñas, el filtrado directo es suficiente.
Mostrar y ocultar la lista desplegable
Abra la lista desplegable cuando inputValue.length > 0 y suggestions.length > 0. Ciérrela cuando el campo pierda el foco (con un pequeño retraso para permitir que los clics en las sugerencias se registren primero), cuando se seleccione una sugerencia o cuando se pulse la tecla Escape. Establezca isOpen según corresponda para controlar el renderizado condicional.
Gestión del desenfoque con retraso
El evento onBlur se dispara cuando el campo de entrada pierde el foco, lo que ocurre cuando el usuario hace clic en una sugerencia. Si cierra la lista desplegable inmediatamente al producirse el desenfoque, el clic en la sugerencia nunca se registra porque la lista desaparece antes de que se dispare el clic. Use setTimeout(() => setIsOpen(false), 150) para dar tiempo a que el clic se registre.
Aplicación de estilos a la lista desplegable
Posicione la lista desplegable con position: absolute para que se superponga al contenido situado debajo del campo, en lugar de desplazarlo. Establezca un z-index alto (100 o superior) para que aparezca por encima del resto del contenido. Establezca un max-height junto con overflow-y: auto para evitar que la lista crezca demasiado cuando haya muchos resultados.
Hacer clicables las sugerencias
Cada elemento de sugerencia debe tener un controlador onClick: onClick={() => { setInputValue(suggestion); setIsOpen(false); }}. Esto establece en el campo la sugerencia seleccionada y cierra la lista desplegable. La selección resulta inmediata y natural, tal como esperan los usuarios de los campos de autocompletado.
Evitar el desenfoque antes del clic
Una alternativa al temporizador de desenfoque consiste en usar onMouseDown={e => e.preventDefault()} en cada elemento de sugerencia. Esto evita que el evento mousedown quite el foco al campo de entrada, por lo que el evento de desenfoque no se dispara al hacer clic en una sugerencia. El campo conserva el foco y el controlador del clic se ejecuta correctamente.
Descripción general de la interacción con el teclado
Un buen autocompletado debe poder usarse con el teclado. El usuario debe poder pulsar ArrowDown para resaltar la primera sugerencia, seguir pulsando la tecla para avanzar por la lista, pulsar Enter para seleccionar y pulsar Escape para cerrar sin seleccionar. Esto se implementa gestionando onKeyDown en el elemento de entrada.
Restablecimiento de selectedIndex al cambiar el campo
Cada vez que el usuario escribe y cambia inputValue, restablezca selectedIndex a -1. Esto elimina cualquier selección anterior del teclado para que el nuevo conjunto de sugerencias filtradas comience sin ningún elemento resaltado. Un índice de selección obsoleto que apunte a otro elemento después de cambiar la lista resulta confuso e incorrecto.
Orden de los eventos Blur y MouseDown
¿Por qué se usa onMouseDown con e.preventDefault() en los elementos de sugerencia en lugar de depender de un temporizador de desenfoque?
Resumen de la lección: campo controlado con sugerencias
Un widget de autocompletado necesita cuatro variables de estado: inputValue, suggestions, isOpen y selectedIndex. Use un campo de entrada controlado, filtre las sugerencias según el contenido del campo y controle la visibilidad de la lista desplegable mediante isOpen. Gestione la condición de carrera entre el desenfoque y el clic con un temporizador o con onMouseDown y preventDefault. Restablezca selectedIndex cada vez que cambie el campo de entrada.
Preguntas frecuentes
¿La lección «Input controlado con lista de sugerencias» es gratis?
Sí — el texto completo de «Input controlado con lista de sugerencias» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de React Academy, actualiza a CoddyKit PRO. El curso de React Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Input controlado con lista de sugerencias»?
Crear la base: un input controlado que muestre debajo un menú desplegable de sugerencias filtradas Practicas React Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar React Academy?
No se requiere experiencia previa. React Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.
¿Cuánto tiempo toma la lección «Input controlado con lista de sugerencias»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de React Academy?
Sí. Cada lección de React Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Input controlado con lista de sugerencias
- Navegación con teclado en listas de sugerencias
- Sugerencias asíncronas con debounce
- Accesibilidad para widgets de autocompletado