Sugerencias asíncronas con debounce
Obtener sugerencias de una API mientras el usuario escribe, aplicando debounce para evitar solicitudes de red excesivas
Sugerencias asíncronas con debounce es una lección gratuita de React Academy en CoddyKit. Esta es la lección 3 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.
Reemplazar el filtro estático por una solicitud a la API
En lugar de filtrar un arreglo local, llame a un punto de conexión de la API que devuelva sugerencias coincidentes según la consulta. La llamada a la API se realiza en un useEffect que depende del valor de entrada con debounce. Esto traslada la responsabilidad del filtrado al servidor, lo que permite realizar coincidencias aproximadas, clasificar resultados y ofrecer sugerencias a partir de un conjunto de datos mucho mayor.
Nuevo estado para la carga y los errores
Añada dos nuevas variables de estado al autocompletado: isLoading (booleano) para mostrar un indicador mientras la solicitud está en curso, y error (cadena o null) para mostrar un mensaje de error cuando falle la solicitud. Así, los usuarios reciben información sobre la operación asíncrona en lugar de quedarse preguntándose por qué no aparecen las sugerencias.
El efecto de fetch
En el useEffect de fetch, establezca setIsLoading(true) y setError(null) al principio; después, llame a fetch(url), analice el JSON, llame a setSuggestions(data) y, finalmente, establezca setIsLoading(false) en un bloque finally o después de las rutas de éxito y error. El arreglo de dependencias del efecto contiene únicamente debouncedInputValue.
Usar AbortController para cancelar solicitudes
Cree un nuevo AbortController al principio del efecto y pase controller.signal a las opciones de fetch. En la función de limpieza, llame a controller.abort(). Cuando el usuario escribe y cambia el valor con debounce, la solicitud fetch anterior se aborta antes de iniciar la nueva, lo que evita que lleguen resultados obsoletos fuera de orden.
Gestión de errores de aborto
Cuando se aborta una solicitud fetch, esta se rechaza con una DOMException cuyo nombre es AbortError. En el bloque catch, compruebe if (err.name === 'AbortError') return; para ignorar silenciosamente las solicitudes abortadas. Gestione únicamente los errores de red reales o los errores de la API que deban mostrarse al usuario.
Gestión del estado isLoading
Establezca isLoading en true antes de la solicitud fetch y en false después de que se resuelva o se rechace. Use un bloque finally para asegurarse de que siempre se restablezca: fetch(url).then(...).catch(...).finally(() => setIsLoading(false)). Sin el bloque finally, un error de fetch dejaría el indicador de carga ejecutándose indefinidamente.
Indicador de carga en la lista desplegable
Cuando isLoading sea true y el campo de entrada contenga texto, muestre la lista desplegable con un indicador de carga centrado en su interior, en lugar de la lista de sugerencias. Esto indica al usuario que los resultados están por llegar. Cuando la carga termine y hayan llegado las sugerencias, sustituya el indicador por los elementos de sugerencia correspondientes.
Estado de error en la lista desplegable
Cuando error no sea null, muestre la lista desplegable con el mensaje de error en lugar de las sugerencias. Un mensaje como "No se pudieron cargar las sugerencias. Inténtelo de nuevo." resulta más claro que una cadena de error sin procesar. También puede añadir un botón de reintento que vuelva a activar la solicitud fetch manualmente.
Umbral mínimo de caracteres
Evite realizar solicitudes fetch para cadenas vacías o consultas demasiado cortas que produzcan demasiados resultados irrelevantes. Añada esta condición al principio del efecto: if (debouncedInputValue.length < 2) { setSuggestions([]); return; }. Esto reduce las llamadas innecesarias a la API y evita mostrar una lista abrumadora de resultados a partir de un solo carácter.
Almacenamiento en caché de resultados obtenidos
Almacene los resultados obtenidos en un Map de useRef: const cache = useRef(new Map()). Antes de realizar la solicitud fetch, compruebe if (cache.current.has(query)) { setSuggestions(cache.current.get(query)); return; }. Después de una solicitud fetch correcta, almacene el resultado. Esto elimina las solicitudes de red redundantes para las consultas que el usuario ya ha escrito.
Retraso de debounce recomendado
Para el autocompletado, específicamente, un retraso de debounce de 200-300 ms es el punto óptimo. Los retrasos más cortos (inferiores a 200 ms) activan demasiadas solicitudes cuando se escribe rápido. Los retrasos más largos (superiores a 400 ms) hacen que las sugerencias parezcan lentas y poco receptivas. 250 ms es un valor predeterminado habitual en implementaciones de autocompletado en producción.
AbortController en el autocompletado
¿Por qué es importante AbortController en un autocompletado con debounce que obtiene datos de una API?
Resumen de la lección: sugerencias asíncronas con debounce
Sustituya el filtrado estático por una solicitud fetch a una API dentro de un useEffect que dependa del valor con debounce. Use AbortController para cancelar las solicitudes obsoletas. Añada los estados isLoading y error para proporcionar información al usuario. Establezca un umbral mínimo de caracteres para evitar llamadas excesivas. Almacene los resultados en una referencia para omitir las solicitudes de red redundantes.
Preguntas frecuentes
¿La lección «Sugerencias asíncronas con debounce» es gratis?
Sí — el texto completo de «Sugerencias asíncronas con debounce» 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 «Sugerencias asíncronas con debounce»?
Obtener sugerencias de una API mientras el usuario escribe, aplicando debounce para evitar solicitudes de red excesivas 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 3 de 4.
¿Cuánto tiempo toma la lección «Sugerencias asíncronas con debounce»?
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