Implementando scroll infinito en Vue.js

El scroll infinito tienen su lugar en la web, pero no encaja en cualquier página web o aplicación. Son especialmente útiles cuando necesitamos cargar grandes cantidades de datos o imágenes cuando el usuario los necesita en lugar de todos a la vez. Las redes sociales como Twitter, Facebook o Instagram los han hecho populares estos últimos años. Integrar tu propio scroll infinito en tu web o aplicación es más fácil de lo que imaginas.
En este artículo vamos a usar la API Usuario Aleatorio (Random User API). Esta API se describe a sí misma como «Igual que Lorem Ipsum, pero para personas». No sólo es genial por su implementación, sino que también es útil para simular perfiles de usuario para proyectos.
Antes de empezar, creamos un nuevo proyecto Vue.js usando la plantilla webpack-simple de Vue CLI. En este ejemplo usaremos Axios y MomentJS para recuperar datos y formatear fechas, respectivamente.

Obteniendo los datos iniciales del usuario

Existen varios paquetes npm para scroll infinito que podemos usar en nuestra aplicación Vue, pero algunos pueden ser excesivamente complejos. Para este artículo, no usaremos ningún plugin o paquete y escribiremos una sencilla función JavaScript que recupera un nuevo grupo de datos cuando llegamos al final de la ventana del navegador.
Antes de empezar a integrar el scroll infinito, recuperamos y asignamos datos iniciales en la carga de la página:

Vale la pena señalar que no es recomendable hacer cinco llamadas a servicios en la carga. La API Random User sólo devuelve un usuario aleatorio cada vez. Así que para obtener cinco usuarios iniciales, se necesitan cinco llamadas al servicio.

Si mostramos en la consola el array persons o abrimos las Vue Devtools, deberíamos ver un array de cinco usuarios. Si es así, ¡perfecto! Ahora vamos a iterar sobre estos datos en la template, darles estilo y continuar:

Implementando la lógica del scroll infinito

Ahora, a por lo que hemos venido… ¡el scroll infinito! En los métodos del componente, necesitamos crear una nueva función llamada scroll() y tenerlo cargado en el método del ciclo de vida mounted().
Este método scroll() debería tener una sencilla condición que calcula el final de la página, evalúa si es verdadero o falos y ejecuta algo. Usaremos las propiedades de los objetos del document documentElement.scrollTop y documentElement.offsetHeight, así como la propiedad innerHeight para determina si el scroll está en el final:

Dentro de esta condición, añadiremos un método GET de servicio con Axios para recuperar otro usuario aleatorio de la API Random User.

Esta función realiza una llamada al servicio y añade un nuevo «user» aleatorio al array persons sólo cuando el usuario realiza un scroll al final de la página. En este punto, deberíamos poder hacer scroll infinitamente y ver un nuevo «user» cada vez.

Conclusión

El scroll infinito suena intimidatorio pero, como hemos demostrado, es bastante sencillo. Con cada scroll al final de la página, recuperamos nuevos datos con Axios y después introducimos esos datos en un array. Para cargar imágenes de forma diferida (lazy load), tan sólo inserta una imagen en el array de datos, itera sobre él en tu template y vincula <img :src=""> al array.

Nota: puedes encontrar el artículo original en https://alligator.io/vuejs/implementing-infinite-scroll/

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *