一套基於 Vue.js 的高質量UI 組件庫,此篇介紹Scroll(無限卷軸顯示資料清單)
<scroll :on-reach-bottom="handleReachBottom"
:on-reach-top="handleReachTop"
distance-to-edge=10
loading-text="Loading"
height="300">
<!-- list data -->
<card style="width:320px;margin:32px 0" v-for="(item, index) in listData" :key="item.id">
<div style="text-align:center">
<img style="width:50px;height:50px;" :src="item.img">
<h3>{{item.id}}. {{ item.name }}</h3>
</div>
</card>
</scroll>
以上用到的Props:
Prop | Description | Type | Default value |
---|---|---|---|
height | 捲動區域的高度pixel | String/Number | 300 |
loading-text | 加載資料時顯示詞 | String | 加载中 |
distance-to-edge | 從邊緣至觸發Callback的距離 | Number/Array | [20,20] |
on-reach-bottom | 滾動至底部時觸發,須回傳Promise | Function | |
on-reach-top | 滾動至頂端時觸發,須回傳Promise | Function |
若要指定當滾動至底部或頂端時觸發事件,可利用Prop: on-reach-edge
。
以下當滾動至底部或頂端時,再隨機取得三筆資料加入清單。
const FOO_DATA_BASIC = [
{id: 1, name:'Luke Skywalker',gender:'male', img:'https://goo.gl/KEUxHN'},
//...
];
const FOO_DATA_BRIGHT = [
{id: 1, name:'Luke Skywalker',gender:'male', img:'https://goo.gl/KEUxHN'},
//...
];
const FOO_DATA_DARK = [
{id: 9,name:'Darth Vader',gender:'male',img:'https://goo.gl/xcMHqj'},
//...
];
var app = new Vue({
el: "#app",
data: {
listData: []
},
methods: {
handleReachBottom () {
return new Promise(resolve => {
setTimeout(() => {
for (let i = 0; i < 3; i++) { //Get random 3 records
let rndIndex = this.getRandomInt(0, FOO_DATA_BRIGHT.length-1)
this.listData.push(FOO_DATA_BRIGHT[rndIndex]);
}
resolve();
}, 2000);
});
},
handleReachTop(){
return new Promise(resolve => {
setTimeout(() => {
for (let i = 0; i < 3; i++) { //Get random 3 records
let rndIndex = this.getRandomInt(0, FOO_DATA_DARK.length-1)
this.listData.push(FOO_DATA_DARK[rndIndex]);
}
resolve();
}, 2000);
});
},
getRandomInt(min,max) {
return Math.floor(Math.random()*(max-min+1)+min);
}
},
created() {
this.listData = FOO_DATA_BASIC;
}
})
更多應用可參考相關API官方文件。
如果有興趣自己寫個Infinite Scroll,可參考小弟這篇文章:[Vue] Infinite scrolling page