vue-infinite-scroll 使用紀錄

Huang Pei
5 min readOct 29, 2019

--

infinte scroll

自己使用的工具是vue、firebase,希望能達到 infinte scroll 的效果。

尋找的關鍵字自然是 vue infinite scroll/ firebase infinite scroll/ vue firebase infinite scroll 再加上 infinite loading, lazy loading 等關鍵字的排列組合。

找到與 firebase 的教學都與 Angular 有關,而 vue 的話則是下面二款為主:

第一款已經很久沒維護了,有一些瑕疵,但是使用簡單而且瑕疵也能進行一些簡單的修補,所以在此紀錄一下。

官方使用教學

var count = 0; // 要推入的資料筆數new Vue({
el: '#app',
data: {
data: [], //欲渲染的資料
busy: false }, //true觸發載入,false停止載入
methods: {
loadMore: function() {
this.busy = true; setTimeout(() => {
for (var i = 0, j = 10; i < j; i++) { // j為一次要推入的資料量
this.data.push({ name: count++ });}
this.busy = false;}, 1000);}}});

因為自己有好幾個不同區塊要用到同份資料,所以先用firebase將資料都存入 courses 這個空陣列,並新增 infiniteData: [] 來專跑 inifinite scroll 的部分。

自己的想法很簡單,每往下滑就從 courses 往 infiniteData 倒入 5 筆資料,直到 infiniteData.length === courses.length為止。

<template>
<div
class="infinite-scroll"
v-infinite-scroll="loadMore"
infinite-scroll-disabled="busy"
infinite-scroll-distance="15">
<i v-if="infiniteData.length!==courses.length"
class="fas fa-spinner fa-spin"></i>
//此處為自訂的loading icon,並設定當只有在兩個陣列長度不相等時才會顯示
</div>
</template>
_____
<script>data() {return {
count: 0, //要推入的資料筆數
infiniteData: [],//inifinite scroll渲染的部分
busy: false, //true觸發載入,false停止載入
courses: [],}; //全部的資料
},
methods: { loadMore: function() { if (this.infiniteData.length <= this.courses.length) { this.busy = true; setTimeout(() => {
for (var i = 0, j = 5; i < j; i++) {
if (this.count === this.courses.length) { break;}
this.infiniteData.push(this.courses[this.count++]);}
this.busy = false; }, 1000);}}}</script>
  1. if (this.infiniteData.length <= this.courses.length) 停止無限觸發

vue-infinite-scroll 會有明明資料已經加載完成了,但往下滑 this.count 還會不斷跑的情況出現,因此設定 if (this.infiniteData.length <= this.courses.length) 的條件下才會觸發函式,避免瘋狂加載的情況。

2. if (this.count === this.courses.length) { break } 跳出迴圈

假如設定 j = 5 ,也就是每次加載 5 筆資料,而總資料 courses 卻有 23 筆時,infiniteData 除了被倒入 courses 的資料外,還會被另外倒入 2 筆 undefined 來湊成 5 的倍數 25 筆資料,這時v-for只會顯示前 20 筆資料,後面三筆會受 undefined 影響而不能渲染,因此使用 if (this.count === this.courses.length) { break } ,當 this.count 為 23 時(此時已倒入0~22筆資料)就跳出迴圈,避免 undefined 的產生,如此就能正常渲染了。

--

--

Huang Pei
Huang Pei

Written by Huang Pei

記錄用倉庫,歡迎指正。菜鳥前端,最菜的那種(超能力少女です)。

No responses yet