1、分頁
商品列表的分頁實現是后台根據前端請求的頁面大小、頁碼位置,去數據庫中查詢指定位置的數據然后返回給前端。比如頁面大小為8,要查第3頁的數據,則跳過2*8條數據,然后返回8條數據。
在實現滾動加載時,頁面剛一加載完成並不需要請求所有數據,當用戶下拉到頁面底部時,再去請求數據並拼接到商品數據列表中。
通過vue-infinite-scroll插件實現滾動加載,在框架末尾插入加載div,並且可以在其中放入加載動畫
-
<div v-infinite-scroll="loadMore" infinite-scroll-disabled="busy" infinite-scroll-distance="10">
-
<img v-if="showLoading" src="../../static/loading-svg/loading-spinning-bubbles.svg">//加載動畫
-
</div>
通過busy可以控制是否啟用加載,在loadMore函數中定義你的加載操作,然后通過setTimeout按時間間隔響應加載請求
-
new Vue({
-
el: '#app',
-
data: {
-
data: [],
-
busy: false
-
},
-
methods: {
-
loadMore(){//滾動加載插件
-
this.busy = true;
-
setTimeout(() => {
-
this.page++;
-
this.getGoodsList(true);
-
}, 1000);
-
}
-
}
-
});
商品按價格排序主要是利用nodejs的mongoose中的sort函數對數據庫查詢結果按price關鍵字排序,之后返回給前端。在前端發送排序請求:
-
sortPrice(){//按價格排序
-
this.sortFlag=this.sortFlag==1?-1:1;
-
this.page=1;
-
this.getGoodsList();
-
}
其中1為升序,-1降序,排序之后需要將頁碼置1,然后再去請求商品列表
后端根據前端請求的最大值(priceGt)、最小值(priceLt)去數據庫中查詢指定價位之間的商品並返回給前端,利用mongoose的查詢find函數中的params參數中設置$gt,$lt查詢指定區間的商品
-
let params={
-
salePrice:{$gt:req.query.priceGt,$lt:req.query.priceLt}
-
};
商品前端請求:
-
getGoodsList(split){
-
let param={//get請求的參數
-
pageSize:this.pageSize,
-
page:this.page,
-
sortFlag:this.sortFlag,
-
priceGt:this.priceGt,
-
priceLt:this.priceLt
-
};
-
this.showLoading=true; //啟用加載svg動畫
-
axios.get("/goods",{
-
params:param
-
}).then(response =>{
-
let res=response.data;
-
if(res.status==0){
-
if(split){ //split==true,需要滾動追加頁數
-
this.goodsList=this.goodsList.concat(res.result.list);
-
if(res.result.count==0){//返回0條數據,禁用滾動
-
this.busy=true;
-
}else{
-
this.busy = false;
-
}
-
}else{
-
this.goodsList=res.result.list;
-
}
-
}else{
-
console.log("從服務器請求數據失敗!");
-
}
-
});
服務器端處理:
-
router.get('/',(req,res,next)=>{
-
//獲取請求參數
-
let pageSize=parseInt(req.query.pageSize);
-
let page=parseInt(req.query.page);
-
let sortFlag=req.query.sortFlag;
-
let skipPiece=(page-1)*pageSize;//分頁查詢,跳過前面skip條數據
-
let params={
-
salePrice:{$gt:req.query.priceGt,$lt:req.query.priceLt}
-
};
-
-
//利用goods模板調用mongooseAPI進行數據庫查詢、排序、跳到指定頁
-
let goodsModel=goods.find(params).sort({'salePrice':sortFlag}).skip(skipPiece).limit(pageSize);
-
goodsModel.exec((err,goodsDoc)=>{
-
"use strict";
-
if (err){
-
res.json({
-
status:1,
-
msg:err.message
-
})
-
}else {
-
res.json({//利用res將數據返回給get請求
-
status:0,
-
msg:'',
-
result:{
-
count:goodsDoc.length,
-
list:goodsDoc
-
}
-
})
-
}
-
})
-
});