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.
 
 
 
 
shengxian/components/sh-filter.vue

168 lines
4.5 KiB

<template>
<view class="filter-box">
<view class="cu-modal" style="z-index: -1;" :class="{ show: showSel }" @tap="hideModal"></view>
<view class="navbar">
<!-- <view class="sel-box u-flex-col" v-show="showSel">
<view class="sel-item" @tap="onSel(0)" :class="{ 'sel-active': defaultOrder === 0 && filterIndex === 0 }">综合推荐</view>
<view class="sel-item" @tap="onSel(1)" :class="{ 'sel-active': defaultOrder === 1 && filterIndex === 0 }">扩展自定义排序</view>
</view> -->
<!-- <view class="nav-item u-flex-col" :class="{ current: filterIndex === 0 }" @tap="tabClick(0)">
<view class="title-box u-flex u-col-center">
<text class="filter-title">{{ defaultOrder === 1 ? '自定义' : '综合推荐' }}</text>
<view class="p-box"><text style="font-size: 22rpx;" :class="{ active: filterIndex === 0 }" class="u-iconfont uicon-arrow-up u-m-l-6"></text></view>
</view>
<view class="line" :class="{ 'line-active': filterIndex === 0 }"></view>
</view> -->
<view class="nav-item u-flex-col" :class="{ current: filterIndex === 1 }" @tap="tabClick(1)">
<view class="title-box u-flex"><text class="filter-title">销量</text></view>
<view class="line" :class="{ 'line-active': filterIndex === 1 }"></view>
</view>
<view class="nav-item u-flex-col" :class="{ current: filterIndex === 2 }" @tap="tabClick(2)">
<view class="title-box u-flex">
<text class="filter-title">价格</text>
<view class="p-box u-flex-col u-m-l-6">
<view
class="u-iconfont uicon-arrow-up"
:style="{ fontSize: '20rpx', lineHeight: '18rpx', color: priceOrder === 1 && filterIndex === 2 ? '#17C161' : '#333' }"
></view>
<view
class="u-iconfont uicon-arrow-down"
:style="{ fontSize: '20rpx', lineHeight: '18rpx', color: priceOrder === 2 && filterIndex === 2 ? '#17C161' : '#333' }"
></view>
</view>
</view>
<view class="line" :class="{ 'line-active': filterIndex === 2 }"></view>
</view>
<view class="nav-item u-flex-col" :class="{ current: filterIndex === 3 }" @tap="tabClick(3)">
<view class="title-box"><text class="filter-title">新品优先</text></view>
<view class="line" :class="{ 'line-active': filterIndex === 3 }"></view>
</view>
</view>
</view>
</template>
<script>
/**
* 商品筛选组件
*
*/
import { mapState, mapActions, mapMutations } from 'vuex';
export default {
components: {},
props: {},
data() {
return {
filterIndex: 0,
showSel: false, //综合选择
defaultOrder: 0, //综合
priceOrder: 0, //价格
salesOrder: 0, //销量
newProdcutOrder: 0 //新品优先
};
},
computed: {
filterData() {
const data = {
defaultOrder: this.defaultOrder,
priceOrder: this.priceOrder,
salesOrder: this.salesOrder,
newProdcutOrder: this.newProdcutOrder
};
return data;
}
},
onLoad() {},
methods: {
//筛选
tabClick(index) {
this.filterIndex = index;
index === 0 ? (this.showSel = !this.showSel) : (this.showSel = false);
index === 1 ? (this.salesOrder = 1) : (this.salesOrder = 0);
index === 2 ? (this.priceOrder = this.priceOrder === 1 ? 2 : 1) : (this.priceOrder = 0);
index === 3 ? (this.newProdcutOrder = 1) : (this.newProdcutOrder = 0);
this.$emit('change', this.filterData);
},
onSel(dot) {
this.defaultOrder = dot;
this.$emit('change', this.filterData);
this.showSel = false;
},
hideModal() {
this.showSel = false;
}
}
};
</script>
<style lang="scss" scoped>
.sel-box {
position: absolute;
// width: 750rpx;
height: 140rpx;
background: rgba(246, 246, 246, 1);
border-radius: 0px 0px 20rpx 20rpx;
z-index: 999;
left: 50%;
transform: translateX(-50%);
bottom: -138rpx;
transition: all ease-out 0.2s;
.sel-item {
color: #333;
padding: 20rpx 40rpx 0;
font-size: 24rpx;
font-weight: 500;
}
.sel-active {
color: #17C161;
font-size: 26rpx;
font-weight: 600;
}
}
.filter-box {
// width: 750rpx;
}
.navbar {
display: flex;
// width: 750rpx;
height: 95rpx;
background: #fff;
border-bottom: 1upx solid #e6e6e6;
position: relative;
z-index: 999;
.nav-item {
flex: 1;
display: flex;
justify-content: center;
align-items: center;
height: 100%;
font-size: 30rpx;
position: relative;
.filter-title {
font-size: 28rpx;
color: #333;
font-weight: 600;
}
.line {
width: 110rpx;
height: 4rpx;
background: transparent;
position: absolute;
bottom: 0;
z-index: 2;
}
.line-active {
background: #17C161;
}
.p-box {
display: flex;
flex-direction: column;
}
}
}
.current {
color: #17C161;
}
</style>