506 lines
17 KiB
Vue
506 lines
17 KiB
Vue
<template>
|
|
<div class="product-list">
|
|
<searchtop :keyword="keyword" @onSearch="onSearch" />
|
|
<div class="filterbar">
|
|
<ul :class="filterSort?'show':''">
|
|
<li :class="filterIndex===0?'selected':''" v-on:click="onFilterBar(0)"><span>{{filterIndex==11?'价格最低':(filterIndex==12?'价格最高':'综合')}}</span><van-icon name="arrow" class="down" /></li>
|
|
<li :class="filterIndex===1?'selected':''" v-on:click="onFilterBar(1)"><span>销量</span></li>
|
|
<li :class="filterIndex===2?'selected':''" v-on:click="onFilterBar(2)"><span>上新</span></li>
|
|
<li :class="filterIndex===3?'selected':''" v-on:click="onFilterBar(3)"><span>筛选</span></li>
|
|
</ul>
|
|
<div :class="'item_options '+(filterSort?'show':'')">
|
|
<ul>
|
|
<li :class="filterIndex==10?'selected':''" v-on:click="onFilterBar(10)">综合</li>
|
|
<li :class="filterIndex==11?'selected':''" v-on:click="onFilterBar(11)">价格降序</li>
|
|
<li :class="filterIndex==12?'selected':''" v-on:click="onFilterBar(12)">价格最高</li>
|
|
</ul>
|
|
</div>
|
|
<div :class="'item_options '+(filterShow?'show':'')">
|
|
<ul>
|
|
<li v-for="category in categories" :class="category.id === categoryId ?'selected':''" v-on:click="onCategoryClick(category.id)">
|
|
{{ category.name }}
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
|
|
<!-- <van-popup v-model="filterShow" position="right" class="filterlayer" >-->
|
|
<!-- <div class="filterInner" style="overflow-y: scroll;max-height: 100%;">-->
|
|
<!-- <ul>-->
|
|
<!-- <li>-->
|
|
<!-- <van-cell title="清洁类型" is-link arrow-direction="down" />-->
|
|
<!-- </li>-->
|
|
<!-- <div style="clear: both;"></div>-->
|
|
<!-- <div class="tags_selection">-->
|
|
<!-- <div class="option">-->
|
|
<!-- <a href="javascript:void 0;">牙龈护理111</a>-->
|
|
<!-- </div>-->
|
|
<!-- <div class="option ">-->
|
|
<!-- <a href="javascript:void 0;">抛光</a>-->
|
|
<!-- </div>-->
|
|
<!-- <div class="option ">-->
|
|
<!-- <a href="javascript:void 0;">清洁</a>-->
|
|
<!-- </div>-->
|
|
<!-- <div class="option ">-->
|
|
<!-- <a href="javascript:void 0;">正畸专用</a>-->
|
|
<!-- </div>-->
|
|
<!-- <div class="option ">-->
|
|
<!-- <a href="javascript:void 0;">敏感</a>-->
|
|
<!-- </div>-->
|
|
<!-- <div class="option ">-->
|
|
<!-- <a href="javascript:void 0;">亮白</a>-->
|
|
<!-- </div>-->
|
|
<!-- <div style="clear: both;"></div>-->
|
|
<!-- </div>-->
|
|
<!-- </ul>-->
|
|
<!-- <ul>-->
|
|
<!-- <li>-->
|
|
<!-- <van-cell title="清洁类型" is-link arrow-direction="down" />-->
|
|
<!-- </li>-->
|
|
<!-- <div style="clear: both;"></div>-->
|
|
<!-- <div class="tags_selection">-->
|
|
<!-- <div class="option">-->
|
|
<!-- <a href="javascript:void 0;">牙龈护理111</a>-->
|
|
<!-- </div>-->
|
|
<!-- <div class="option ">-->
|
|
<!-- <a href="javascript:void 0;">抛光</a>-->
|
|
<!-- </div>-->
|
|
<!-- <div class="option ">-->
|
|
<!-- <a href="javascript:void 0;">清洁</a>-->
|
|
<!-- </div>-->
|
|
<!-- <div class="option ">-->
|
|
<!-- <a href="javascript:void 0;">正畸专用</a>-->
|
|
<!-- </div>-->
|
|
<!-- <div class="option ">-->
|
|
<!-- <a href="javascript:void 0;">敏感</a>-->
|
|
<!-- </div>-->
|
|
<!-- <div class="option ">-->
|
|
<!-- <a href="javascript:void 0;">亮白</a>-->
|
|
<!-- </div>-->
|
|
<!-- <div style="clear: both;"></div>-->
|
|
<!-- </div>-->
|
|
<!-- </ul>-->
|
|
<!-- <ul>-->
|
|
<!-- <li>-->
|
|
<!-- <van-cell title="清洁类型" is-link arrow-direction="down" />-->
|
|
<!-- </li>-->
|
|
<!-- <div style="clear: both;"></div>-->
|
|
<!-- <div class="tags_selection">-->
|
|
<!-- <div class="option">-->
|
|
<!-- <a href="javascript:void 0;">牙龈护理111</a>-->
|
|
<!-- </div>-->
|
|
<!-- <div class="option ">-->
|
|
<!-- <a href="javascript:void 0;">抛光</a>-->
|
|
<!-- </div>-->
|
|
<!-- <div class="option ">-->
|
|
<!-- <a href="javascript:void 0;">清洁</a>-->
|
|
<!-- </div>-->
|
|
<!-- <div class="option ">-->
|
|
<!-- <a href="javascript:void 0;">正畸专用</a>-->
|
|
<!-- </div>-->
|
|
<!-- <div class="option ">-->
|
|
<!-- <a href="javascript:void 0;">敏感</a>-->
|
|
<!-- </div>-->
|
|
<!-- <div class="option ">-->
|
|
<!-- <a href="javascript:void 0;">亮白</a>-->
|
|
<!-- </div>-->
|
|
<!-- <div style="clear: both;"></div>-->
|
|
<!-- </div>-->
|
|
<!-- </ul>-->
|
|
<!-- <ul>-->
|
|
<!-- <li>-->
|
|
<!-- <van-cell title="清洁类型" is-link arrow-direction="down" />-->
|
|
<!-- </li>-->
|
|
<!-- <div style="clear: both;"></div>-->
|
|
<!-- <div class="tags_selection">-->
|
|
<!-- <div class="option">-->
|
|
<!-- <a href="javascript:void 0;">牙龈护理111</a>-->
|
|
<!-- </div>-->
|
|
<!-- <div class="option ">-->
|
|
<!-- <a href="javascript:void 0;">抛光</a>-->
|
|
<!-- </div>-->
|
|
<!-- <div class="option ">-->
|
|
<!-- <a href="javascript:void 0;">清洁</a>-->
|
|
<!-- </div>-->
|
|
<!-- <div class="option ">-->
|
|
<!-- <a href="javascript:void 0;">正畸专用</a>-->
|
|
<!-- </div>-->
|
|
<!-- <div class="option ">-->
|
|
<!-- <a href="javascript:void 0;">敏感</a>-->
|
|
<!-- </div>-->
|
|
<!-- <div class="option ">-->
|
|
<!-- <a href="javascript:void 0;">亮白</a>-->
|
|
<!-- </div>-->
|
|
<!-- <div style="clear: both;"></div>-->
|
|
<!-- </div>-->
|
|
<!-- </ul>-->
|
|
<!-- <ul>-->
|
|
<!-- <li>-->
|
|
<!-- <van-cell title="清洁类型" is-link arrow-direction="down" />-->
|
|
<!-- </li>-->
|
|
<!-- <div style="clear: both;"></div>-->
|
|
<!-- <div class="tags_selection">-->
|
|
<!-- <div class="option">-->
|
|
<!-- <a href="javascript:void 0;">牙龈护理111</a>-->
|
|
<!-- </div>-->
|
|
<!-- <div class="option ">-->
|
|
<!-- <a href="javascript:void 0;">抛光</a>-->
|
|
<!-- </div>-->
|
|
<!-- <div class="option ">-->
|
|
<!-- <a href="javascript:void 0;">清洁</a>-->
|
|
<!-- </div>-->
|
|
<!-- <div class="option ">-->
|
|
<!-- <a href="javascript:void 0;">正畸专用</a>-->
|
|
<!-- </div>-->
|
|
<!-- <div class="option ">-->
|
|
<!-- <a href="javascript:void 0;">敏感</a>-->
|
|
<!-- </div>-->
|
|
<!-- <div class="option ">-->
|
|
<!-- <a href="javascript:void 0;">亮白</a>-->
|
|
<!-- </div>-->
|
|
<!-- <div style="clear: both;"></div>-->
|
|
<!-- </div>-->
|
|
<!-- </ul>-->
|
|
<!-- <div style="clear: both;"></div>-->
|
|
<!-- <van-button size="large" style="height: 40px;margin-bottom: 15px;line-height: 40px;">清楚选项</van-button>-->
|
|
<!-- <div style="height:50px;"></div>-->
|
|
<!-- </div>-->
|
|
<!-- <div class="filterlayer_bottom_buttons">-->
|
|
<!-- <span class="filterlayer_bottom_button cancel">取消</span>-->
|
|
<!-- <span class="filterlayer_bottom_button confirm">确认</span>-->
|
|
<!-- </div>-->
|
|
<!-- </van-popup>-->
|
|
</div>
|
|
|
|
<van-list
|
|
v-model="loading"
|
|
:finished="finished"
|
|
finished-text="没有更多了"
|
|
@load="onLoad"
|
|
>
|
|
<div v-for="(product,i) in products" :key="i">
|
|
<product-card :product='product' @click="showProduct(product)" />
|
|
</div>
|
|
</van-list>
|
|
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
import searchtop from "../../components/search/searchtop";
|
|
import {getProductCondition, getProductPage} from "../../api/search";
|
|
|
|
export default {
|
|
components: {
|
|
searchtop
|
|
},
|
|
data() {
|
|
return {
|
|
page: 0,
|
|
pageSize: 10,
|
|
loading: false,
|
|
finished: false,
|
|
|
|
keyword: this.$route.params.keyword,
|
|
|
|
filterIndex: 0,
|
|
filterSort: false, // 是否展示几个【排序】
|
|
filterShow: false, // 是否展示【筛选】
|
|
|
|
sortField: undefined,
|
|
sortOrder: undefined,
|
|
|
|
products:[], // 搜索出的商品
|
|
categories: [], // 筛选的分类
|
|
categoryId: undefined, // 选中的分类编号
|
|
};
|
|
},
|
|
methods: {
|
|
onFilterBar(value) {
|
|
if (value === 0) {
|
|
this.filterSort = !this.filterSort;
|
|
this.filterShow = false;
|
|
} else if (value === 3) {
|
|
this.filterShow = !this.filterShow;
|
|
} else {
|
|
// 如果非合法 10、11、12
|
|
if (value !== 10
|
|
&& value !== 11
|
|
&& value !== 12) {
|
|
alert('暂不支持');
|
|
return;
|
|
}
|
|
// 设置 filterSort 和 filterIndex 属性
|
|
this.filterSort = false;
|
|
this.filterIndex = value;
|
|
// 标记加载中
|
|
this.loading = true;
|
|
// 根据 value 的值,设置 sortField、sortOrder
|
|
switch (value) {
|
|
case 10:
|
|
this.sortField = undefined;
|
|
this.sortOrder = undefined;
|
|
break;
|
|
case 11:
|
|
this.sortField = 'buyPrice';
|
|
this.sortOrder = 'desc';
|
|
break;
|
|
case 12:
|
|
this.sortField = 'buyPrice';
|
|
this.sortOrder = 'asc';
|
|
break;
|
|
}
|
|
// 根据排序,重新搜索
|
|
let page = 1;
|
|
getProductPage({
|
|
pageNo: page,
|
|
pageSize: this.pageSize,
|
|
keyword: this.keyword,
|
|
sortField: this.sortField,
|
|
sortOrder: this.sortOrder,
|
|
}).then(data => {
|
|
this.products = [];
|
|
this.handleData(page, data);
|
|
});
|
|
}
|
|
},
|
|
onCategoryClick(value) {
|
|
// 设置分类编号
|
|
this.categoryId = value;
|
|
// 隐藏弹出
|
|
this.filterShow = false;
|
|
// 根据分类,重新搜索
|
|
let page = 1;
|
|
getProductPage({
|
|
pageNo: page,
|
|
pageSize: this.pageSize,
|
|
keyword: this.keyword,
|
|
sortField: this.sortField,
|
|
sortOrder: this.sortOrder,
|
|
cid: this.categoryId,
|
|
}).then(data => {
|
|
this.products = [];
|
|
this.handleData(page, data);
|
|
});
|
|
},
|
|
showProduct(product){
|
|
this.$router.push('/product/'+product.id);
|
|
},
|
|
onSearch(keyword) {
|
|
this.loading = true;
|
|
// 设置 keyword
|
|
this.keyword = keyword;
|
|
// 重置其它字段
|
|
this.filterIndex = 0;
|
|
this.filterSort = false;
|
|
this.filterShow = false;
|
|
this.sortField = undefined;
|
|
this.sortOrder = undefined;
|
|
this.categoryId = undefined;
|
|
// 查询
|
|
let page = 1;
|
|
getProductPage({
|
|
pageNo: page,
|
|
pageSize: this.pageSize,
|
|
keyword: keyword,
|
|
}).then(data => {
|
|
this.products = [];
|
|
this.handleData(page, data);
|
|
this.loadSearchCondition();
|
|
});
|
|
},
|
|
onLoad() {
|
|
// debugger;
|
|
// 进入下一页
|
|
let page = this.page + 1;
|
|
getProductPage({
|
|
pageNo: page,
|
|
pageSize: this.pageSize,
|
|
keyword: this.keyword,
|
|
}).then(data => {
|
|
this.handleData(page, data);
|
|
this.loadSearchCondition();
|
|
});
|
|
},
|
|
handleData(page, data) {
|
|
this.loading = true;
|
|
// 设置下页面
|
|
this.page = page;
|
|
// 数据保存到 list 中
|
|
this.products.push(...data.list);
|
|
// 判断页数
|
|
if (this.products.length >= data.total) {
|
|
this.finished = true;
|
|
}
|
|
// 标记不在加载中
|
|
this.loading = false;
|
|
},
|
|
loadSearchCondition() {
|
|
getProductCondition({
|
|
keyword: this.keyword,
|
|
}).then(data => {
|
|
this.categories = data.categories;
|
|
});
|
|
}
|
|
},
|
|
mounted() {
|
|
}
|
|
};
|
|
</script>
|
|
|
|
<style lang="less">
|
|
.product-list{
|
|
.additional .price{
|
|
position: absolute;
|
|
bottom: 6px;
|
|
height: 34px;
|
|
}
|
|
}
|
|
.filterbar {
|
|
font-size: 14px;
|
|
position: relative;
|
|
ul {
|
|
width: 100%;
|
|
height: 40px;
|
|
}
|
|
li {
|
|
color: #999;
|
|
width: 25%;
|
|
float: left;
|
|
text-align: center;
|
|
height: 40px;
|
|
line-height: 40px;
|
|
border-bottom: 1px solid #eee;
|
|
i {
|
|
font-size: 12px;
|
|
margin-left: 2px;
|
|
}
|
|
.down {
|
|
-webkit-transform: rotate(90deg);
|
|
transform: rotate(90deg);
|
|
}
|
|
}
|
|
.selected {
|
|
color: #e93b3d;
|
|
}
|
|
.show {
|
|
.down {
|
|
-webkit-transform: rotate(-90deg);
|
|
transform: rotate(-90deg);
|
|
}
|
|
}
|
|
.item_options {
|
|
width: 100%;
|
|
position: absolute;
|
|
top: 41px;
|
|
background: #fff;
|
|
display: none;
|
|
z-index: 1;
|
|
li {
|
|
width: 100%;
|
|
text-align: left;
|
|
padding-left: 10px;
|
|
}
|
|
}
|
|
|
|
.item_options.show {
|
|
display: block;
|
|
}
|
|
.filterlayer {
|
|
width: 85%;
|
|
height: 100%;
|
|
background-color: #f7f7f7;
|
|
&_bottom {
|
|
&_buttons {
|
|
display: -webkit-box;
|
|
display: -webkit-flex;
|
|
display: flex;
|
|
z-index: 10;
|
|
position: absolute;
|
|
bottom: 0;
|
|
left: 0;
|
|
right: 0;
|
|
|
|
.cancel {
|
|
color: #333;
|
|
background-color: #fff;
|
|
box-shadow: 0 -1px 2px 0 rgba(0, 0, 0, 0.07);
|
|
}
|
|
.confirm {
|
|
color: #fff;
|
|
background-color: #e93b3d;
|
|
}
|
|
}
|
|
&_button {
|
|
-webkit-box-flex: 1;
|
|
-webkit-flex: 1;
|
|
flex: 1;
|
|
font-size: 16px;
|
|
height: 49px;
|
|
line-height: 49px;
|
|
text-align: center;
|
|
}
|
|
}
|
|
ul {
|
|
height: auto;
|
|
background: #fff;
|
|
margin-bottom: 15px;
|
|
}
|
|
li {
|
|
width: 100%;
|
|
text-align: left;
|
|
height: auto;
|
|
line-height: initial;
|
|
.van-cell{
|
|
font-size: 16px;
|
|
}
|
|
.big {
|
|
height: 25px;
|
|
max-width: 250px;
|
|
overflow: hidden;
|
|
font-size: 16px;
|
|
color: #333;
|
|
text-overflow: ellipsis;
|
|
margin-left: 10px;
|
|
}
|
|
}
|
|
.filterInner{
|
|
overflow-y: scroll;
|
|
max-height: 100%;
|
|
.van-button{
|
|
height: 40px;
|
|
margin-bottom: 15px;
|
|
line-height: 40px;
|
|
}
|
|
}
|
|
.tags_selection {
|
|
font-size: 14px;
|
|
text-align: center;
|
|
background-color: #fff;
|
|
position: relative;
|
|
margin: 0;
|
|
padding: 10px 0 0 10px;
|
|
.option {
|
|
box-sizing: border-box;
|
|
float: left;
|
|
width: 33.33%;
|
|
padding-right: 10px;
|
|
height: 30px;
|
|
line-height: 30px;
|
|
margin-bottom: 10px;
|
|
a {
|
|
position: relative;
|
|
display: block;
|
|
padding: 0 5px;
|
|
color: #666;
|
|
background-color: #f7f7f7;
|
|
border-radius: 4px;
|
|
overflow: hidden;
|
|
text-overflow: ellipsis;
|
|
height: 30px;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
</style>
|