Aprende a usar fetch para cargar un JSON local y renderizar la lista de empleos en el DOM
midudev
Más clases y directos en YouTube
Renderizando datos con fetch
En la clase anterior aprendimos qué es fetch y cómo funciona de forma asíncrona. Ahora lo aplicamos a nuestro proyecto para traer el archivo data.json y pintar los empleos en la página. Fuente
Cargar un JSON local
fetch no solo sirve para APIs remotas: también podemos pedir archivos que tengamos en nuestro propio proyecto. En este caso, data.json vive junto a nuestro HTML y contiene la lista de trabajos.
fetch('./data.json') .then((response) => response.json()) .then((jobs) => { console.log('Empleos obtenidos:', jobs.length) })
Una vez convertimos la respuesta a JSON, tenemos un array de objetos listo para usar.
Crear elementos dinámicamente
El siguiente paso es recorrer cada empleo y crear un article con toda la información.
const container = document.querySelector('.jobs-listings')fetch('./data.json') // obtenemos el archivo data.json .then((response) => { // convertimos la respuesta a JSON return response.json() }) .then((jobs) => { // recorremos los datos y los mostramos en el DOM jobs.forEach((job) => { // creamos un elemento HTML <article> para cada trabajo const article = document.createElement('article') // añadimos la clase job-listing-card al elemento article.className = 'job-listing-card' // añadimos los datos al elemento article.dataset.modalidad = job.data.modalidad article.dataset.nivel = job.data.nivel article.dataset.technology = job.data.technology // añadimos el contenido HTML al elemento article.innerHTML = `<div> <h3>${job.titulo}</h3> <small>${job.empresa} | ${job.ubicacion}</small> <p>${job.descripcion}</p> </div> <button class="button-apply-job">Aplicar</button>` // añadimos el elemento al contenedor container.appendChild(article) }) })
¿Qué hacemos con cada empleo?
- Creamos un
articlepara mantener la estructura HTML que ya teníamos - Añadimos clases y atributos
data-*para que los filtros sigan funcionando - Inyectamos el contenido con
innerHTML - Agregamos el
articleal contenedor principal
Mostrando un mensaje mientras cargamos
Podemos mejorar la experiencia del usuario mostrando un estado de carga y removiéndolo cuando terminamos.
const loading = document.querySelector('#jobs-loading')fetch('./data.json') .then((response) => response.json()) .then((jobs) => { if (loading) loading.remove() if (jobs.length === 0) { container.innerHTML = '<p>No hay empleos disponibles por ahora.</p>' return } jobs.forEach((job) => { // ... mismo código anterior }) }) .catch((error) => { if (loading) loading.textContent = 'No se pudieron cargar los empleos' console.error(error) })
¡Esto no lo hacemos en la clase en vídeo! Pero te animo a que lo hagas tu mismo para practicar.
¡Los puntos clave!
fetchtambién funciona con archivos alojados en tu proyecto- Podemos convertir la respuesta a JSON y usar los datos como un array normal
- Crear elementos dinamicamente nos permite reutilizar los filtros que ya construimos
- Añadir estados de carga y manejo de errores mejora la experiencia del usuario
Esto nos deja la base para seguir enriqueciendo la aplicación: podremos combinar fetch con filtros, paginación o incluso guardar los datos en un backend en clases futuras.
