You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
591 lines
16 KiB
591 lines
16 KiB
<template>
|
|
<!-- 商品分类第一种布局样式 -->
|
|
<view class='productSort copy-data' :style="{height:pageHeight}">
|
|
<view :style="{paddingTop: sysHeight + 'px'}" class="text--w111-999">
|
|
<view class="h-80 px-32 flex-y-center">
|
|
<!-- #ifdef MP -->
|
|
<view class="flex-1 h-58 flex-y-center rd-30rpx bg--w111-fff px-32" @tap="goSearch">
|
|
<!-- #endif -->
|
|
<!-- #ifndef MP -->
|
|
<view class="w-full h-58 flex-y-center rd-30rpx bg--w111-fff px-32" @tap="goSearch">
|
|
<!-- #endif -->
|
|
<text class="iconfont icon-ic_search fs-28"></text>
|
|
<text class="fs-24 pl-18">请输入商品名称1</text>
|
|
</view>
|
|
<!-- 胶囊占据的位置 -->
|
|
<!-- #ifdef MP -->
|
|
<view class="ml-12" :style="'width:'+getHeight.barWidth+'px'"></view>
|
|
<!-- #endif -->
|
|
</view>
|
|
</view>
|
|
<view class="scroll-box">
|
|
<view class='aside'>
|
|
<scroll-view scroll-y="true" scroll-with-animation='true' :style="[asideHeights]">
|
|
<view class='item acea-row row-center-wrapper' :class='index==navActive?"on":""'
|
|
v-for="(item,index) in productList" :key="index" @click='tap(index,"b"+index)'>
|
|
<view class="top-ra">
|
|
<text></text>
|
|
</view>
|
|
<text>{{item.cate_name}}</text>
|
|
<view class="bottom-ra">
|
|
<text></text>
|
|
</view>
|
|
</view>
|
|
<!-- #ifdef APP-PLUS -->
|
|
<view class="item" v-if="isFooter"></view>
|
|
<!-- #endif -->
|
|
</scroll-view>
|
|
</view>
|
|
<view class='conter' v-if="level == 2">
|
|
<scroll-view scroll-y="true" :scroll-into-view="toView" @scroll="scroll" scroll-with-animation='true'
|
|
class="conterScroll height-add">
|
|
<block v-for="(item,index) in productList" :key="index">
|
|
<view class='listw' :id="'b'+index">
|
|
<view class="card mt-20">
|
|
<view class="title" @tap="goPage(1,`/pages/goods/goods_list/index?cid=${item.id}&title=${item.cate_name}`)">{{item.cate_name}} <text class="iconfont icon-ic_rightarrow"></text> </view>
|
|
<view class="grid_box">
|
|
<block v-for="(itemn,indexn) in item.children" :key="indexn">
|
|
<navigator hover-class='none'
|
|
:url='"/pages/goods/goods_list/index?sid="+itemn.id+"&title="+itemn.cate_name'
|
|
class='item acea-row row-column row-middle'>
|
|
<easy-loadimage
|
|
mode="widthFix"
|
|
:image-src="itemn.pic"
|
|
width="130rpx"
|
|
height="130rpx"
|
|
borderRadius="12rpx"></easy-loadimage>
|
|
<view class='cate_name line1'>{{itemn.cate_name}}</view>
|
|
</navigator>
|
|
</block>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
</block>
|
|
<view :style='"height:"+(height-heightDiv)+"rpx;"'></view>
|
|
</scroll-view>
|
|
</view>
|
|
<view class="conter relative" v-else-if="level == 3">
|
|
<view class="flex-1 pl-24 pr-20 abs-lt" v-if="productList.length && productList[navActive].children.length">
|
|
<view class="flex mt-24 mb-16">
|
|
<scroll-view scroll-x="true" class="white-nowrap vertical-middle w-464"
|
|
show-scrollbar="false">
|
|
<view class="inline-block mr-16"
|
|
v-for="(item,index) in productList[navActive].children" :key="index">
|
|
<view class="w-144 h-56 rd-30rpx bg--w111-fff flex-center fs-24 text--w111-333"
|
|
:class="index == tabClick ? 'cate_active':''"
|
|
@tap="longClick(index,item)">{{item.cate_name}}</view>
|
|
</view>
|
|
</scroll-view>
|
|
<view class="bntCon w-56 h-56 rd-30rpx bg--w111-fff flex-center ml-16"
|
|
@tap="openCateDrawer()">
|
|
<text class="iconfont icon-ic_downarrow fs-32 text--w111-333"></text>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
<view class="h-96" v-if="productList.length && productList[navActive].children.length"></view>
|
|
<view v-if="imageShow">
|
|
<emptyPage title="暂无商品,去看点别的吧~" ></emptyPage>
|
|
</view>
|
|
<scroll-view scroll-y="true" scroll-with-animation='true'
|
|
class="conterScroll" :style="[conterHeights]" v-if="productList.length">
|
|
<block>
|
|
<view class='listw' v-for="(item,index) in productList[navActive].children" v-if="tabClick == index">
|
|
<view class="card mb-20" v-if="item.children && item.children.length">
|
|
<view class="title" @tap="goPage(1,`/pages/goods/goods_list/index?sid=${item.id}&title=${item.cate_name}`)">
|
|
<text>{{item.cate_name}} </text>
|
|
<text class="iconfont icon-ic_rightarrow"></text>
|
|
</view>
|
|
<view class="grid_box">
|
|
<block v-for="(itemn,indexn) in item.children" :key="indexn">
|
|
<navigator hover-class='none'
|
|
:url='"/pages/goods/goods_list/index?tid="+itemn.id+"&title="+itemn.cate_name'
|
|
class='item acea-row row-column row-middle'>
|
|
<easy-loadimage
|
|
mode="widthFix"
|
|
:image-src="itemn.pic"
|
|
width="130rpx"
|
|
height="130rpx"
|
|
borderRadius="12rpx"></easy-loadimage>
|
|
<view class='cate_name line1'>{{itemn.cate_name}}</view>
|
|
</navigator>
|
|
</block>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
</block>
|
|
<view :style='"height:"+(height-heightDiv)+"rpx;"'></view>
|
|
</scroll-view>
|
|
</view>
|
|
</view>
|
|
<view class="more_box abs-lt w-full bg--w111-fff rd-b-32rpx z-20" v-if="showCateDrawer && level == 3">
|
|
<view :style="{paddingTop: sysHeight + 'px'}">
|
|
<view class="h-80 px-32 flex-y-center">
|
|
<!-- #ifdef MP -->
|
|
<view class="flex-1 h-58 flex-y-center rd-30rpx bg--w111-f5f5f5 px-32">
|
|
<!-- #endif -->
|
|
<!-- #ifndef MP -->
|
|
<view class="w-full h-58 flex-y-center rd-30rpx bg--w111-f5f5f5 px-32">
|
|
<!-- #endif -->
|
|
<text class="iconfont icon-ic_search fs-28"></text>
|
|
<text class="fs-24 text--w111-999 pl-18">请输入商品名称</text>
|
|
</view>
|
|
<!-- 胶囊占据的位置 -->
|
|
<!-- #ifdef MP -->
|
|
<view class="ml-12" :style="'width:'+getHeight.barWidth+'px'"></view>
|
|
<!-- #endif -->
|
|
</view>
|
|
</view>
|
|
<view class="pt-32 pl-30 pr-30">
|
|
<view>
|
|
<view class="fs-32 text--w111-333" v-if="productList[navActive].children.length">
|
|
{{productList[navActive].children[tabClick].cate_name}}
|
|
</view>
|
|
<view class="grid-column-4 grid-gap-24rpx mt-24">
|
|
<view class="w-154 h-56 rd-30rpx flex-center fs-24 text--w111-333 bg--w111-f5f5f5"
|
|
v-for="(item,index) in productList[navActive].children" :key="index"
|
|
@tap="longClick(index,item)"
|
|
:class="index===tabClick?'cate_active':''">
|
|
{{item.cate_name}}
|
|
</view>
|
|
</view>
|
|
</view>
|
|
<view class="flex-center fs-24 text--w111-999 h-80 mt-32" @tap="closeCateDrawer">
|
|
<text>点击收起 <text class="iconfont icon-ic_uparrow pl-4"></text> </text>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
<view class="mask" v-show="showCateDrawer" @tap="closeCateDrawer"></view>
|
|
</view>
|
|
</template>
|
|
|
|
<script>
|
|
let sysHeight = uni.getSystemInfoSync().statusBarHeight;
|
|
let windowBottom = uni.getSystemInfoSync().windowBottom;
|
|
import {getCategoryList} from '@/api/store.js';
|
|
import { getCategoryVersion } from '@/api/api.js';
|
|
import {mapState,mapGetters} from "vuex"
|
|
import emptyPage from '@/components/emptyPage.vue';
|
|
const app = getApp();
|
|
export default {
|
|
props: {
|
|
level:{
|
|
type:Number,
|
|
default:2
|
|
},
|
|
isFooter:{
|
|
type:Boolean,
|
|
default:false
|
|
},
|
|
pdHeight:{
|
|
type:Number,
|
|
default:0
|
|
}
|
|
},
|
|
components: {
|
|
emptyPage
|
|
},
|
|
data() {
|
|
return {
|
|
navlist: [],
|
|
productList: [],
|
|
navActive: 0,
|
|
number: "",
|
|
height: 0,
|
|
heightDiv: 0,
|
|
hightArr: [],
|
|
toView: "",
|
|
tabbarH: 0,
|
|
footH: 0,
|
|
windowHeight: 0,
|
|
pageHeight: '100%',
|
|
sysHeight: sysHeight,
|
|
// #ifdef APP-PLUS
|
|
pageHeight: app.globalData.windowHeight,
|
|
// #endif
|
|
footerStatus: false,
|
|
lock: false,
|
|
tabClick:0,
|
|
showCateDrawer: false,
|
|
getHeight: this.$util.getWXStatusHeight()
|
|
}
|
|
},
|
|
computed: {
|
|
...mapState({
|
|
cartNum: state => state.indexData.cartNum
|
|
}),
|
|
asideHeights(){
|
|
let H = `calc(100% - ${this.pdHeight*2 + 96}rpx - env(safe-area-inset-bottom))`
|
|
return{
|
|
//#ifdef H5
|
|
height: this.isFooter?H:'100%'
|
|
//#endif
|
|
// #ifdef MP || APP-PLUS
|
|
height: this.isFooter?H:'100%'
|
|
//#endif
|
|
}
|
|
},
|
|
conterHeights(){
|
|
let H = `calc(100% - ${this.pdHeight*2 + 192}rpx - env(safe-area-inset-bottom))`
|
|
let H2 = `calc(100% - ${this.pdHeight*2 + 192}rpx - env(safe-area-inset-bottom))`
|
|
let HZ = `calc(100% - 96rpx - env(safe-area-inset-bottom))`
|
|
return{
|
|
//#ifdef H5
|
|
height: this.isFooter?H:HZ
|
|
//#endif
|
|
// #ifdef MP || APP-PLUS
|
|
height: this.isFooter?H2:HZ
|
|
//#endif
|
|
}
|
|
},
|
|
imageShow(){
|
|
let obj = this.productList.length && this.productList[this.navActive].children.length && this.productList[this.navActive].children[this.tabClick] &&
|
|
this.productList[this.navActive].children[this.tabClick].hasOwnProperty("children")
|
|
return !obj
|
|
}
|
|
},
|
|
// watch:{
|
|
// cartNum(){
|
|
// this.getCartList(1);
|
|
// }
|
|
// },
|
|
mounted() {
|
|
let that = this
|
|
this.getAllCategory();
|
|
// #ifdef H5
|
|
uni.getSystemInfo({
|
|
success: function(res) {
|
|
that.pageHeight = res.windowHeight + 'px'
|
|
}
|
|
});
|
|
// #endif
|
|
},
|
|
methods: {
|
|
footHeight(data) {
|
|
this.footH = data
|
|
},
|
|
closeCateDrawer() {
|
|
this.showCateDrawer = false;
|
|
},
|
|
openCateDrawer() {
|
|
this.showCateDrawer = true;
|
|
},
|
|
// 导航栏点击
|
|
longClick(index, item) {
|
|
this.tabClick = index; //设置导航点击了哪一个
|
|
// this.sid = this.categoryErList[index].id;
|
|
// this.page = 1;
|
|
// this.loadend = false;
|
|
// this.tempArr = [];
|
|
// this.productslist();
|
|
},
|
|
infoScroll: function() {
|
|
let that = this;
|
|
let len = that.productList.length;
|
|
this.number = that.productList[len - 1].children.length;
|
|
let height = 0;
|
|
let hightArr = [];
|
|
//设置商品列表高度
|
|
let query = uni.createSelectorQuery().in(this);
|
|
query.select(".conter").boundingClientRect();
|
|
query.exec(function(res){
|
|
height = res[0].height;
|
|
})
|
|
for (let i = 0; i < len; i++) {
|
|
//获取元素所在位置
|
|
let query = uni.createSelectorQuery().in(this);
|
|
let idView = "#b" + i;
|
|
query.select(idView).boundingClientRect();
|
|
query.exec(function(res) {
|
|
let top = res[0].top;
|
|
that.hightArr.push(top);
|
|
if(len == that.hightArr.length){
|
|
//设置转化比例
|
|
uni.getSystemInfo({
|
|
success: function(res) {
|
|
let per = (750 / res.windowWidth);
|
|
that.height = height * per;
|
|
that.heightDiv = (that.hightArr[that.hightArr.length-1] - that.hightArr[that.hightArr.length-2])*per;
|
|
},
|
|
});
|
|
}
|
|
});
|
|
};
|
|
},
|
|
tap: function(index, id) {
|
|
this.toView = id;
|
|
this.navActive = index;
|
|
this.tabClick = 0;
|
|
this.$set(this, 'lock', true);
|
|
},
|
|
getAllCategory() {
|
|
getCategoryList().then(res => {
|
|
this.productList = res.data;
|
|
if(this.level == 2){
|
|
this.$nextTick(res => {
|
|
this.infoScroll();
|
|
})
|
|
}
|
|
})
|
|
},
|
|
scroll: function(e) {
|
|
let scrollTop = e.detail.scrollTop;
|
|
let scrollArr = this.hightArr;
|
|
if (this.lock) {
|
|
this.$set(this, 'lock', false);
|
|
return;
|
|
}
|
|
for (let i = 0; i < scrollArr.length; i++) {
|
|
if (scrollTop >= 0 && scrollTop < scrollArr[1] - scrollArr[0]) {
|
|
this.navActive = 0
|
|
} else if (scrollTop >= scrollArr[i] - scrollArr[0] && scrollTop < scrollArr[i + 1] - scrollArr[
|
|
0]) {
|
|
this.navActive = i
|
|
} else if (scrollTop >= scrollArr[scrollArr.length - 1] - scrollArr[0]) {
|
|
this.navActive = scrollArr.length - 1
|
|
}
|
|
}
|
|
uni.$emit('scroll');
|
|
},
|
|
searchSubmitValue: function(e) {
|
|
if (this.$util.trim(e.detail.value).length > 0)
|
|
uni.navigateTo({
|
|
url: '/pages/goods/goods_list/index?searchValue=' + e.detail.value
|
|
})
|
|
else
|
|
return this.$util.Tips({
|
|
title: '请填写要搜索的产品信息'
|
|
});
|
|
},
|
|
goSearch() {
|
|
uni.navigateTo({
|
|
url: '/pages/goods/goods_search/index'
|
|
})
|
|
},
|
|
goPage(type, url){
|
|
if(type == 1){
|
|
uni.navigateTo({
|
|
url
|
|
})
|
|
}else if(type == 2){
|
|
uni.switchTab({
|
|
url
|
|
})
|
|
}else if(type == 3){
|
|
uni.navigateBack();
|
|
}
|
|
|
|
},
|
|
},
|
|
}
|
|
</script>
|
|
<style>
|
|
page {
|
|
/* height: 100%; */
|
|
background: #f5f5f5;
|
|
}
|
|
</style>
|
|
<style scoped lang="scss">
|
|
.bntCon{
|
|
position: relative;
|
|
&:before{
|
|
position: absolute;
|
|
content: '';
|
|
width: 6rpx;
|
|
height: 80rpx;
|
|
background: radial-gradient( rgba(0,0,0,0.082) 0%, rgba(0,0,0,0) 100%);
|
|
left:-22rpx;
|
|
}
|
|
}
|
|
|
|
/deep/uni-scroll-view{
|
|
padding-bottom: 0!important;
|
|
}
|
|
.height-add {
|
|
height: 100%;
|
|
}
|
|
.sys-title {
|
|
z-index: 10;
|
|
position: relative;
|
|
height: 40px;
|
|
line-height: 40px;
|
|
font-size: 34rpx;
|
|
color: #333;
|
|
text-align: center;
|
|
}
|
|
.productSort {
|
|
display: flex;
|
|
flex-direction: column;
|
|
//#ifdef MP
|
|
height: calc(100vh - var(--window-top)) !important;
|
|
//#endif
|
|
//#ifndef MP
|
|
height: 100vh
|
|
//#endif
|
|
}
|
|
|
|
.productSort .header {
|
|
width: 100%;
|
|
height: 96rpx;
|
|
background-color: #f5f5f5;
|
|
}
|
|
|
|
.productSort .header .input {
|
|
width: 700rpx;
|
|
height: 60rpx;
|
|
background-color: #fff;
|
|
border-radius: 50rpx;
|
|
box-sizing: border-box;
|
|
padding: 0 25rpx;
|
|
}
|
|
|
|
.productSort .header .input .iconfont {
|
|
font-size: 35rpx;
|
|
color: #555;
|
|
}
|
|
|
|
.productSort .header .input .placeholder {
|
|
color: #999;
|
|
}
|
|
|
|
.productSort .header .input input {
|
|
font-size: 26rpx;
|
|
height: 100%;
|
|
width: 597rpx;
|
|
}
|
|
|
|
.productSort .scroll-box {
|
|
flex: 1;
|
|
overflow: hidden;
|
|
display: flex;
|
|
}
|
|
|
|
// #ifndef MP
|
|
uni-scroll-view {
|
|
padding-bottom: 100rpx;
|
|
}
|
|
|
|
// #endif
|
|
|
|
.productSort .aside {
|
|
width: 168rpx;
|
|
height: 100%;
|
|
overflow: hidden;
|
|
background-color: #fff;
|
|
}
|
|
|
|
.productSort .aside .item {
|
|
height: 96rpx;
|
|
width: 100%;
|
|
font-size: 28rpx;
|
|
color: #666;
|
|
text-align: center;
|
|
}
|
|
|
|
.productSort .aside .item.on {
|
|
background-color: #f5f5f5;
|
|
width: 100%;
|
|
color: var(--view-theme);
|
|
font-weight: 500;
|
|
position: relative;
|
|
&:before{
|
|
content:'';
|
|
width:6rpx;
|
|
height: 48rpx;
|
|
background-color: var(--view-theme);
|
|
position: absolute;
|
|
left: 0;
|
|
top: 50%;
|
|
transform: translateY(-50%);
|
|
border-radius: 0 10rpx 10rpx 0;
|
|
}
|
|
.top-ra{
|
|
width: 32rpx;
|
|
height: 32rpx;
|
|
background-color: #f5f5f5;
|
|
position: absolute;
|
|
right: 0;
|
|
top:-32rpx;
|
|
text{
|
|
position: absolute;
|
|
top:0;
|
|
right: 0;
|
|
width: 100%;
|
|
height: 100%;
|
|
background-color: #fff;
|
|
display: inline-block;
|
|
border-radius: 0 0 24rpx 0;
|
|
}
|
|
}
|
|
.bottom-ra{
|
|
width: 32rpx;
|
|
height: 32rpx;
|
|
background-color: #f5f5f5;
|
|
position: absolute;
|
|
right: 0;
|
|
bottom:-32rpx;
|
|
text{
|
|
position: absolute;
|
|
top:0;
|
|
right: 0;
|
|
width: 100%;
|
|
height: 100%;
|
|
background-color: #fff;
|
|
display: inline-block;
|
|
border-radius: 0 24rpx 0 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
.productSort .conter {
|
|
flex: 1;
|
|
height: 100%;
|
|
overflow: hidden;
|
|
padding: 0 20rpx;
|
|
position: relative;
|
|
background-color: #f5f5f5;
|
|
}
|
|
.productSort .conter .banner{
|
|
width: 100%;
|
|
height: 160rpx;
|
|
border-radius: 16rpx;
|
|
margin-top: 20rpx;
|
|
}
|
|
.productSort .conter .card{
|
|
width: 100%;
|
|
background-color: #fff;
|
|
border-radius: 16rpx;
|
|
padding: 32rpx 24rpx;
|
|
}
|
|
.productSort .conter .card .title{
|
|
font-size: 28rpx;
|
|
font-weight: 500;
|
|
color: #333;
|
|
line-height: 40rpx;
|
|
}
|
|
.productSort .conter .card .iconfont{
|
|
font-size: 24rpx;
|
|
}
|
|
.productSort .conter .card .grid_box{
|
|
display: grid;
|
|
grid-template-columns: repeat(3, 1fr);
|
|
grid-template-rows: auto;
|
|
grid-row-gap: 32rpx;
|
|
grid-column-gap: 50rpx;
|
|
margin-top: 20rpx;
|
|
.cate_name{
|
|
font-size: 24rpx;
|
|
color: #333;
|
|
line-height: 34rpx;
|
|
margin-top: 12rpx;
|
|
text-align: center;
|
|
}
|
|
}
|
|
.cate_active {
|
|
color: var(--view-theme);
|
|
background: var(--view-minorColorT);
|
|
border: 1px solid var(--view-theme);
|
|
}
|
|
.pl-30 {
|
|
padding-left: 30rpx;
|
|
}
|
|
</style>
|
|
|