shuinishop/pages/goods/goods-list/goods-list.vue

286 lines
8.6 KiB
Vue
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view>
<!-- <view class="header" :style="{position:headerPosition,top:headerTop}">
<view class="target" v-for="(target,index) in orderbyList" @tap="select(index)" :key="index" :class="[target.selected?'on':'']">
{{target.text}}
<view v-if="target.orderbyicon" class="icon" :class="target.orderbyicon[target.orderby]"></view>
</view>
</view> -->
<!-- 占位 -->
<!-- <view class="place"></view> -->
<!-- 商品列表 -->
<view class="goods-list">
<view class="product-list">
<view class="product" v-for="(goods) in goodsList" :key="goods.id" @tap="toGoods(goods)">
<image mode="aspectFill" :src="goods.picurl"></image>
<view class="name">{{goods.title}}</view>
<view class="info">
<view class="price">{{goods.price}}</view>
<view class="slogan">{{ goods.pay_num }}人已付款</view>
</view>
</view>
</view>
<view class="loading-text">{{loadingText}}</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
cid:null,
page:1,
// goodsList:[
// { goods_id: 0, img: '/static/img/goods/p1.jpg', name: '商品名称商品名称商品名称商品名称商品名称', price: '¥168', slogan:'1235人付款' },
// { goods_id: 1, img: '/static/img/goods/p2.jpg', name: '商品名称商品名称商品名称商品名称商品名称', price: '¥168', slogan:'1235人付款' },
// { goods_id: 2, img: '/static/img/goods/p3.jpg', name: '商品名称商品名称商品名称商品名称商品名称', price: '¥168', slogan:'1235人付款' },
// { goods_id: 3, img: '/static/img/goods/p4.jpg', name: '商品名称商品名称商品名称商品名称商品名称', price: '¥168', slogan:'1235人付款' },
// { goods_id: 4, img: '/static/img/goods/p5.jpg', name: '商品名称商品名称商品名称商品名称商品名称', price: '¥168', slogan:'1235人付款' },
// { goods_id: 5, img: '/static/img/goods/p6.jpg', name: '商品名称商品名称商品名称商品名称商品名称', price: '¥168', slogan:'1235人付款' },
// { goods_id: 6, img: '/static/img/goods/p7.jpg', name: '商品名称商品名称商品名称商品名称商品名称', price: '¥168', slogan:'1235人付款' },
// { goods_id: 7, img: '/static/img/goods/p8.jpg', name: '商品名称商品名称商品名称商品名称商品名称', price: '¥168', slogan:'1235人付款' },
// { goods_id: 8, img: '/static/img/goods/p9.jpg', name: '商品名称商品名称商品名称商品名称商品名称', price: '¥168', slogan:'1235人付款' },
// { goods_id: 9, img: '/static/img/goods/p10.jpg', name: '商品名称商品名称商品名称商品名称商品名称', price: '¥168', slogan:'1235人付款' }
// ],
goodsList:[],
loadingText:"正在加载...",
headerTop:"0px",
headerPosition:"fixed",
orderbyList:[
{text:"销量",selected:true,orderbyicon:false,orderby:0},
{text:"价格",selected:false,orderbyicon:['sheng','jiang'],orderby:0},
{text:"好评",selected:false,orderbyicon:false,orderby:0}
],
orderby:"sheng"
};
},
onLoad: function (option) { //option为object类型会序列化上个页面传递的参数
//console.log(option); //打印出上个页面传递的参数。
uni.setNavigationBarTitle({
title: option.name
});
this.cid = option.cid
this.getGoods()
//兼容H5下排序栏位置
// #ifdef H5
//定时器方式循环获取高度为止这么写的原因是onLoad中head未必已经渲染出来。
let Timer = setInterval(()=>{
let uniHead = document.getElementsByTagName('uni-page-head');
if(uniHead.length>0){
this.headerTop = uniHead[0].offsetHeight+'px';
clearInterval(Timer);//清除定时器
}
},1);
// #endif
},
onPageScroll(e){
//兼容iOS端下拉时顶部漂移
if(e.scrollTop>=0){
this.headerPosition = "fixed";
}else{
this.headerPosition = "absolute";
}
},
//下拉刷新需要自己在page.json文件中配置开启页面下拉刷新 "enablePullDownRefresh": true
onPullDownRefresh() {
this.reload()
uni.stopPullDownRefresh();
// setTimeout(()=>{
// this.reload();
// }, 1000);
},
//上拉加载需要自己在page.json文件中配置"onReachBottomDistance"
onReachBottom(){
this.loadingText ='正在加载'
this.page = this.page + 1
this.getGoods()
// uni.showToast({title: '触发上拉加载'});
// let len = this.goodsList.length;
// if(len>=40){
// this.loadingText="到底了";
// return false;
// }else{
// this.loadingText="正在加载...";
// }
// let end_goods_id = this.goodsList[len-1].goods_id;
// for(let i=1;i<=10;i++){
// let goods_id = end_goods_id+i;
// let p = { goods_id: goods_id, img: '/static/img/goods/p'+(goods_id%10==0?10:goods_id%10)+'.jpg', name: '商品名称商品名称商品名称商品名称商品名称', price: '¥168', slogan:'1235人付款' };
// this.goodsList.push(p);
// }
},
methods:{
getGoods(){
this.loadingText='正在加载中'
this.$u.api.getGoods(this.cid, {page:this.page}).then(res=>{
var goodsList = []
this.loadingText=''
if(res.data==null){
this.loadingText="到底了"
}else{
for(var i=0;i<res.data.length;i++){
goodsList.push({
id:res.data[i].aid,
title:res.data[i].title,
picurl:this.vuex_host+ '/public/' + res.data[i].picurl.split(',')[0] ,
price:res.data[i].price,
pay_num:res.data[i].pay_num
})
}
if(this.page==1){
this.goodsList = goodsList
}else{
this.goodsList = this.goodsList.concat(goodsList)
}
}
})
},
reload(){
console.log("reload");
let tmpArr = []
this.goodsList = [];
this.page=1
this.getGoods()
// let end_goods_id = 0;
// for(let i=1;i<=10;i++){
// let goods_id = end_goods_id+i;
// let p = { goods_id: goods_id, img: '/static/img/goods/p'+(goods_id%10==0?10:goods_id%10)+'.jpg', name: '商品名称商品名称商品名称商品名称商品名称', price: '¥168', slogan:'1235人付款' };
// this.goodsList.push(p);
// }
},
//商品跳转
toGoods(e){
uni.navigateTo({
url: '../goods?id='+e.id
});
},
//排序类型
select(index){
let tmpTis = this.orderbyList[index].text+"排序 "
if(this.orderbyList[index].orderbyicon){
let type = this.orderbyList[index].orderby==0?'升序':'降序';
if(this.orderbyList[index].selected){
type = this.orderbyList[index].orderby==0?'降序':'升序';
this.orderbyList[index].orderby = this.orderbyList[index].orderby==0?1:0;
}
tmpTis+=type
}
this.orderbyList[index].selected = true;
let len = this.orderbyList.length;
for(let i=0;i<len;i++){
if(i!=index){
this.orderbyList[i].selected = false;
}
}
uni.showToast({title:tmpTis,icon:"none"});
}
}
}
</script>
<style lang="scss">
.icon {
font-size:26upx;
}
.header{
width: 92%;
padding: 0 4%;
height: 79upx;
display: flex;
justify-content: space-around;
align-items: flex-end;
position: fixed;
top: 0;
z-index: 10;
background-color: #fff;
border-bottom: solid 1upx #eee;
.target{
width: 20%;
height: 60upx;
display: flex;
justify-content: center;
align-items: center;
font-size: 28upx;
margin-bottom: -2upx;
color: #aaa;
&.on{
color: #555;
border-bottom: 4upx solid #f06c7a;
font-weight: 600;
font-size: 30upx;
}
}
}
.place{
background-color: #ffffff;
height: 100upx;
}
.goods-list{
.loading-text{
width: 100%;
display: flex;
justify-content: center;
align-items: center;
height: 60upx;
color: #979797;
font-size: 24upx;
}
.product-list{
width: 92%;
padding: 0 4% 3vw 4%;
display: flex;
justify-content: space-between;
flex-wrap: wrap;
.product{
width: 48%;
border-radius: 20upx;
background-color: #fff;
margin: 0 0 15upx 0;
box-shadow: 0upx 5upx 25upx rgba(0,0,0,0.1);
image{
width: 100%;
height: 48vw;
border-radius: 20upx 20upx 0 0;
}
.name{
width: 92%;
padding: 10upx 4%;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
text-align: justify;
overflow: hidden;
font-size: 30upx;
}
.info{
display: flex;
justify-content: space-between;
align-items: flex-end;
width: 92%;
padding: 10upx 4% 10upx 4%;
.price{
color: #e65339;
font-size: 30upx;
font-weight: 600;
}
.slogan{
color: #807c87;
font-size: 24upx;
}
}
}
}
}
</style>