5 changed files with 406 additions and 0 deletions
@ -0,0 +1,406 @@ |
|||||
|
<template> |
||||
|
<view class="content"> |
||||
|
<!-- <view class="navbar" :style="{ position: headerPosition, top: headerTop }"> |
||||
|
<view class="nav-item" v-for="(item, index) in cateList" :key="index" :class="{ current: filterIndex === item.id }" @click="tabClick(item.id)">{{item.name}}</view> |
||||
|
|
||||
|
</view> --> |
||||
|
<view class="goods-list"> |
||||
|
<view v-for="(item, index) in goodsList" :key="index" class="goods-item" @click="navToDetailPage(item)"> |
||||
|
<view class="image-wrapper"> |
||||
|
<image :src="item.pic" mode="aspectFill"></image> |
||||
|
</view> |
||||
|
<text class="title clamp">{{ item.title }}</text> |
||||
|
<view class="price-box"> |
||||
|
<text>收藏量 {{ item.collectCount }}</text> |
||||
|
<text>浏览量 {{ item.readCount }}</text> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
<uni-load-more :status="loadingType"></uni-load-more> |
||||
|
|
||||
|
<view class="cate-mask" :class="cateMaskState === 0 ? 'none' : cateMaskState === 1 ? 'show' : ''" |
||||
|
@click="toggleCateMask"> |
||||
|
<view class="cate-content" @click.stop.prevent="stopPrevent" @touchmove.stop.prevent="stopPrevent"> |
||||
|
<scroll-view scroll-y class="cate-list"> |
||||
|
<view v-for="item in cateList" :key="item.id"> |
||||
|
<view class="cate-item b-b two">{{ item.name }}</view> |
||||
|
<view v-for="tItem in item.child" :key="tItem.id" class="cate-item b-b" |
||||
|
:class="{ active: tItem.id == cateId }" @click="changeCate(tItem)"> |
||||
|
{{ tItem.name }} |
||||
|
</view> |
||||
|
</view> |
||||
|
</scroll-view> |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
</view> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
import mallplusCopyright from '@/components/mall-copyright/mallplusCopyright.vue'; |
||||
|
import Api from '@/common/api'; |
||||
|
import uniLoadMore from '@/components/uni-load-more/uni-load-more.vue'; |
||||
|
export default { |
||||
|
components: { |
||||
|
mallplusCopyright, |
||||
|
uniLoadMore |
||||
|
}, |
||||
|
data() { |
||||
|
return { |
||||
|
cateMaskState: 0, //分类面板展开状态 |
||||
|
headerPosition: 'fixed', |
||||
|
headerTop: '0px', |
||||
|
categoryId: '', |
||||
|
loadingType: 'more', //加载更多状态 |
||||
|
filterIndex: 0, |
||||
|
cateId: 0, //已选三级分类id |
||||
|
pageNum: 1, |
||||
|
cid: null, |
||||
|
priceOrder: 0, //1 价格从低到高 2价格从高到低 |
||||
|
cateList: [], |
||||
|
goodsList: [] |
||||
|
}; |
||||
|
}, |
||||
|
|
||||
|
onLoad(options) { |
||||
|
// #ifdef H5 |
||||
|
this.headerTop = document.getElementsByTagName('uni-page-head')[0].offsetHeight + 'px'; |
||||
|
// #endif |
||||
|
|
||||
|
// this.cateId = options.sid; |
||||
|
// this.loadCateList(options.fid, options.sid); |
||||
|
this.loadData(); |
||||
|
}, |
||||
|
onPageScroll(e) { |
||||
|
//兼容iOS端下拉时顶部漂移 |
||||
|
// if (e.scrollTop >= 0) { |
||||
|
// this.headerPosition = 'fixed'; |
||||
|
// } else { |
||||
|
// this.headerPosition = 'absolute'; |
||||
|
// } |
||||
|
}, |
||||
|
//下拉刷新 |
||||
|
onPullDownRefresh() { |
||||
|
this.pageNum = this.pageNum + 1; |
||||
|
this.loadData('refresh'); |
||||
|
}, |
||||
|
//加载更多 |
||||
|
onReachBottom() { |
||||
|
this.pageNum = this.pageNum + 1; |
||||
|
this.loadData(); |
||||
|
}, |
||||
|
methods: { |
||||
|
// //加载分类 |
||||
|
// async loadCateList() { |
||||
|
// let params = {'showStatus':1}; |
||||
|
// let list = await Api.apiCall('get', Api.cms.subjectCategoryList, params); |
||||
|
|
||||
|
// this.cateList = list.records; |
||||
|
// }, |
||||
|
//加载商品 ,带下拉刷新和上滑加载 |
||||
|
async loadData(type = 'add', loading) { |
||||
|
//没有更多直接返回 |
||||
|
if (type === 'add') { |
||||
|
if (this.loadingType === 'nomore') { |
||||
|
return; |
||||
|
} |
||||
|
this.loadingType = 'loading'; |
||||
|
} else { |
||||
|
this.loadingType = 'more'; |
||||
|
} |
||||
|
let params = { |
||||
|
pageNum: this.pageNum, |
||||
|
categoryId: 38 |
||||
|
}; |
||||
|
|
||||
|
// if (this.categoryId) { |
||||
|
// params = { |
||||
|
// pageNum: this.pageNum, |
||||
|
// categoryId: this.categoryId |
||||
|
// }; |
||||
|
// } else { |
||||
|
// params = { |
||||
|
// pageNum: this.pageNum |
||||
|
// }; |
||||
|
// } |
||||
|
|
||||
|
let list = await Api.apiCall('get', Api.cms.subjectList, params); |
||||
|
let goodsList = list.records; |
||||
|
// let goodsList = await this.$api.json('goodsList'); |
||||
|
if (type === 'refresh') { |
||||
|
this.goodsList = []; |
||||
|
} |
||||
|
|
||||
|
this.goodsList = this.goodsList.concat(goodsList); |
||||
|
|
||||
|
//判断是否还有下一页,有是more 没有是nomore(测试数据判断大于20就没有了) |
||||
|
this.loadingType = this.goodsList.length > list.total ? 'nomore' : 'more'; |
||||
|
if (type === 'refresh') { |
||||
|
if (loading == 1) { |
||||
|
uni.hideLoading(); |
||||
|
} else { |
||||
|
uni.stopPullDownRefresh(); |
||||
|
} |
||||
|
} |
||||
|
}, |
||||
|
// //筛选点击 |
||||
|
// tabClick(index) { |
||||
|
// console.log('tab='+index); |
||||
|
// this.pageNum = 1; |
||||
|
|
||||
|
// this.categoryId = index; |
||||
|
|
||||
|
// uni.pageScrollTo({ |
||||
|
// duration: 300, |
||||
|
// scrollTop: 0 |
||||
|
// }); |
||||
|
// this.loadData('refresh', 1); |
||||
|
|
||||
|
// }, |
||||
|
// //显示分类面板 |
||||
|
// toggleCateMask(type) { |
||||
|
// let timer = type === 'show' ? 10 : 300; |
||||
|
// let state = type === 'show' ? 1 : 0; |
||||
|
// this.cateMaskState = 2; |
||||
|
// setTimeout(() => { |
||||
|
// this.cateMaskState = state; |
||||
|
// }, timer); |
||||
|
// }, |
||||
|
// //分类点击 |
||||
|
// changeCate(item) { |
||||
|
// this.pageNum = 1; |
||||
|
// this.cateId = item.id; |
||||
|
// this.toggleCateMask(); |
||||
|
// uni.pageScrollTo({ |
||||
|
// duration: 300, |
||||
|
// scrollTop: 0 |
||||
|
// }); |
||||
|
// this.loadData('refresh', 1); |
||||
|
|
||||
|
// }, |
||||
|
//详情 |
||||
|
navToDetailPage(item) { |
||||
|
//测试数据没有写id,用title代替 |
||||
|
let id = item.id; |
||||
|
let groupId = item.groupId; |
||||
|
uni.navigateTo({ |
||||
|
url: `../../pagesU/notice/subjectDetail?id=${id}` |
||||
|
}); |
||||
|
}, |
||||
|
stopPrevent() {} |
||||
|
} |
||||
|
}; |
||||
|
</script> |
||||
|
|
||||
|
<style lang="scss"> |
||||
|
page, |
||||
|
.content { |
||||
|
background: $page-color-base; |
||||
|
} |
||||
|
|
||||
|
.content { |
||||
|
padding-top: 96upx; |
||||
|
} |
||||
|
|
||||
|
.navbar { |
||||
|
position: fixed; |
||||
|
left: 0; |
||||
|
top: var(--window-top); |
||||
|
display: flex; |
||||
|
width: 100%; |
||||
|
height: 80upx; |
||||
|
background: #fff; |
||||
|
box-shadow: 0 2upx 10upx rgba(0, 0, 0, 0.06); |
||||
|
z-index: 10; |
||||
|
|
||||
|
.nav-item { |
||||
|
flex: 1; |
||||
|
display: flex; |
||||
|
justify-content: center; |
||||
|
align-items: center; |
||||
|
height: 100%; |
||||
|
font-size: 30upx; |
||||
|
color: $font-color-dark; |
||||
|
position: relative; |
||||
|
|
||||
|
&.current { |
||||
|
color: $base-color; |
||||
|
|
||||
|
&:after { |
||||
|
content: ''; |
||||
|
position: absolute; |
||||
|
left: 50%; |
||||
|
bottom: 0; |
||||
|
transform: translateX(-50%); |
||||
|
width: 120upx; |
||||
|
height: 0; |
||||
|
border-bottom: 4upx solid $base-color; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.p-box { |
||||
|
display: flex; |
||||
|
flex-direction: column; |
||||
|
|
||||
|
.yticon { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
justify-content: center; |
||||
|
width: 30upx; |
||||
|
height: 14upx; |
||||
|
line-height: 1; |
||||
|
margin-left: 4upx; |
||||
|
font-size: 26upx; |
||||
|
color: #888; |
||||
|
|
||||
|
&.active { |
||||
|
color: $base-color; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.xia { |
||||
|
transform: scaleY(-1); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.cate-item { |
||||
|
display: flex; |
||||
|
justify-content: center; |
||||
|
align-items: center; |
||||
|
height: 100%; |
||||
|
width: 80upx; |
||||
|
position: relative; |
||||
|
font-size: 44upx; |
||||
|
|
||||
|
&:after { |
||||
|
content: ''; |
||||
|
position: absolute; |
||||
|
left: 0; |
||||
|
top: 50%; |
||||
|
transform: translateY(-50%); |
||||
|
border-left: 1px solid #ddd; |
||||
|
width: 0; |
||||
|
height: 36upx; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/* 分类 */ |
||||
|
.cate-mask { |
||||
|
position: fixed; |
||||
|
left: 0; |
||||
|
top: var(--window-top); |
||||
|
bottom: 0; |
||||
|
width: 100%; |
||||
|
background: rgba(0, 0, 0, 0); |
||||
|
z-index: 95; |
||||
|
transition: 0.3s; |
||||
|
|
||||
|
.cate-content { |
||||
|
width: 630upx; |
||||
|
height: 100%; |
||||
|
background: #fff; |
||||
|
float: right; |
||||
|
transform: translateX(100%); |
||||
|
transition: 0.3s; |
||||
|
} |
||||
|
|
||||
|
&.none { |
||||
|
display: none; |
||||
|
} |
||||
|
|
||||
|
&.show { |
||||
|
background: rgba(0, 0, 0, 0.4); |
||||
|
|
||||
|
.cate-content { |
||||
|
transform: translateX(0); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.cate-list { |
||||
|
display: flex; |
||||
|
flex-direction: column; |
||||
|
height: 100%; |
||||
|
|
||||
|
.cate-item { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
height: 90upx; |
||||
|
padding-left: 30upx; |
||||
|
font-size: 28upx; |
||||
|
color: #555; |
||||
|
position: relative; |
||||
|
} |
||||
|
|
||||
|
.two { |
||||
|
height: 64upx; |
||||
|
color: #303133; |
||||
|
font-size: 30upx; |
||||
|
background: #f8f8f8; |
||||
|
} |
||||
|
|
||||
|
.active { |
||||
|
color: $base-color; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/* 商品列表 */ |
||||
|
.goods-list { |
||||
|
display: flex; |
||||
|
flex-wrap: wrap; |
||||
|
padding: 0 30upx; |
||||
|
background: #fff; |
||||
|
|
||||
|
.goods-item { |
||||
|
display: flex; |
||||
|
flex-direction: column; |
||||
|
width: 48%; |
||||
|
padding-bottom: 40upx; |
||||
|
|
||||
|
&:nth-child(2n + 1) { |
||||
|
margin-right: 4%; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.image-wrapper { |
||||
|
width: 100%; |
||||
|
height: 330upx; |
||||
|
border-radius: 3px; |
||||
|
overflow: hidden; |
||||
|
|
||||
|
image { |
||||
|
width: 100%; |
||||
|
height: 100%; |
||||
|
opacity: 1; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.title { |
||||
|
font-size: $font-lg; |
||||
|
color: $font-color-dark; |
||||
|
line-height: 80upx; |
||||
|
} |
||||
|
|
||||
|
.price-box { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
justify-content: space-between; |
||||
|
padding-right: 10upx; |
||||
|
font-size: 24upx; |
||||
|
color: $font-color-light; |
||||
|
} |
||||
|
|
||||
|
.price { |
||||
|
font-size: $font-lg; |
||||
|
color: $uni-color-primary; |
||||
|
line-height: 1; |
||||
|
|
||||
|
&:before { |
||||
|
content: '¥'; |
||||
|
font-size: 26upx; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
</style> |
After Width: | Height: | Size: 73 KiB |
After Width: | Height: | Size: 4.9 MiB |
After Width: | Height: | Size: 66 KiB |
After Width: | Height: | Size: 562 KiB |
Loading…
Reference in new issue