267 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			Vue
		
	
	
			
		
		
	
	
			267 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			Vue
		
	
	
| <template>
 | |
| 	<view>
 | |
| 		<view class='searchGood'>
 | |
| 			<view class='search acea-row row-between-wrapper'>
 | |
| 				<view class='input acea-row row-between-wrapper'>
 | |
| 					<text class='iconfont icon-sousuo2'></text>
 | |
| 					<input type='text' :value='searchValue' :focus="focus" placeholder='点击搜索商品'
 | |
|                  placeholder-class='placeholder' @input="setValue" />
 | |
| 				</view>
 | |
| 				<view class='bnt' @tap='searchBut'>搜索</view>
 | |
| 			</view>
 | |
|       <!-- 搜索词 -->
 | |
| 			<view class='title'>热门搜索</view>
 | |
| 			<view class='list acea-row'>
 | |
| 				<block v-for="(item,index) in hotSearchList" :key="index">
 | |
| 					<view class='item' @tap='setHotSearchValue(item.title)'>{{item.title}}</view>
 | |
| 				</block>
 | |
| 			</view>
 | |
| 			<view class='line'></view>
 | |
|       <!-- 搜索结果 -->
 | |
| 			<goodList :bastList="bastList" v-if="bastList.length > 0" />
 | |
| 			<view class='loadingicon acea-row row-center-wrapper' v-if="bastList.length > 0">
 | |
| 				<text class='loading iconfont icon-jiazai' :hidden='!loading' /> {{loadTitle}}
 | |
| 			</view>
 | |
| 		</view>
 | |
| 
 | |
|     <!-- 商品推荐 -->
 | |
| 		<view class='noCommodity'>
 | |
| 			<view class='pictrue'  v-if="bastList.length === 0 && isbastList">
 | |
| 				<image src='../../static/images/noSearch.png'></image>
 | |
| 			</view>
 | |
| 			<recommend :hostProduct='hostProduct' v-if="bastList.length === 0"></recommend>
 | |
| 		</view>
 | |
| 	</view>
 | |
| </template>
 | |
| 
 | |
| <script>
 | |
| 	import { getSearchKeyword } from '@/api/store.js';
 | |
| 	import goodList from '@/components/goodList';
 | |
| 	import recommend from '@/components/recommend';
 | |
|   import * as ProductSpuApi from '@/api/product/spu.js';
 | |
|   import * as PromotionActivityApi from '@/api/promotion/activity.js';
 | |
|   import * as ProductUtil from '@/utils/product.js';
 | |
|   export default {
 | |
| 		components: {
 | |
| 			goodList,
 | |
| 			recommend
 | |
| 		},
 | |
| 		data() {
 | |
| 			return {
 | |
|         // ========== 商品搜索 ==========
 | |
|         hotSearchList: [], // 热门搜索词
 | |
|         searchValue: '',
 | |
| 				focus: true,
 | |
| 
 | |
| 				bastList: [],  // 商品搜索结果
 | |
| 				limit: 8,
 | |
| 				page: 1,
 | |
| 				loading: false,
 | |
| 				loadend: false,
 | |
| 				loadTitle: '加载更多',
 | |
| 				isbastList: false,
 | |
| 
 | |
|         // ========== 商品推荐 ==========
 | |
|         hostProduct: [],
 | |
|         hotPage: 1,
 | |
|         isScroll: true,
 | |
|       };
 | |
| 		},
 | |
| 		onShow: function() {
 | |
| 			this.getRoutineHotSearch();
 | |
| 			this.getHostProduct();
 | |
| 		},
 | |
| 		onReachBottom: function() {
 | |
| 			if(this.bastList.length > 0){
 | |
| 				this.getProductList();
 | |
| 			} else {
 | |
| 				this.getHostProduct();
 | |
| 			}
 | |
| 		},
 | |
| 		methods: {
 | |
|       /**
 | |
|        * TODO 芋艿:待接入
 | |
|        */
 | |
| 			getRoutineHotSearch: function() {
 | |
| 				getSearchKeyword().then(res => {
 | |
| 					this.$set(this, 'hotSearchList', res.data);
 | |
| 				});
 | |
| 			},
 | |
|       /**
 | |
|        * 输入搜索热词
 | |
|        *
 | |
|        * @param searchValue 搜索热词
 | |
|        */
 | |
|       setHotSearchValue: function(searchValue) {
 | |
|         this.setValue(searchValue);
 | |
|         this.page = 1;
 | |
|         this.loadend = false;
 | |
|         this.$set(this, 'bastList', []);
 | |
|         this.getProductList();
 | |
|       },
 | |
|       /**
 | |
|        * 输入搜索词
 | |
|        *
 | |
|        * @param searchValue 搜索词
 | |
|        */
 | |
|       setValue: function(searchValue) {
 | |
|         this.$set(this, 'searchValue', searchValue.detail.value);
 | |
|       },
 | |
|       /**
 | |
|        * 点击搜索
 | |
|        */
 | |
|       searchBut: function() {
 | |
|         this.focus = false;
 | |
|         if (this.searchValue.length > 0) {
 | |
|           this.page = 1;
 | |
|           this.loadend = false;
 | |
|           this.$set(this, 'bastList', []);
 | |
|           uni.showLoading({
 | |
|             title: '正在搜索中'
 | |
|           });
 | |
|           this.getProductList();
 | |
|           uni.hideLoading();
 | |
|         } else {
 | |
|           return this.$util.Tips({
 | |
|             title: '请输入要搜索的商品',
 | |
|             icon: 'none',
 | |
|             duration: 1000,
 | |
|             mask: true,
 | |
|           });
 | |
|         }
 | |
|       },
 | |
|       /**
 | |
|        * 执行搜索商品
 | |
|        */
 | |
| 			getProductList: function() {
 | |
| 				if (this.loadend || this.loading) {
 | |
|           return;
 | |
|         }
 | |
| 				this.loading = true;
 | |
| 				this.loadTitle = '';
 | |
|         ProductSpuApi.getSpuPage({
 | |
| 					keyword: this.searchValue,
 | |
|           pageNo: this.page,
 | |
|           pageSize: this.limit
 | |
| 				}).then(res => {
 | |
| 					const good_list = res.data.list;
 | |
|           const	loadend = good_list.length < this.limit;
 | |
| 					this.loading = false;
 | |
| 					this.loadend = loadend;
 | |
| 					this.loadTitle = loadend ? "😕人家是有底线的~~" : "加载更多";
 | |
| 					this.page = this.page + 1;
 | |
| 					this.isbastList = true;
 | |
|           // 设置营销活动
 | |
|           const spuIds = good_list.map(item => item.id);
 | |
|           if (spuIds.length > 0) {
 | |
|             PromotionActivityApi.getActivityListBySpuIds(spuIds).then(res => {
 | |
|               ProductUtil.setActivityList(good_list, res.data);
 | |
|               this.bastList = this.$util.SplitArray(good_list, this.bastList); // 放在此处,避免 Vue 监控不到数组里的元素变化
 | |
|             });
 | |
|           }
 | |
|         }).catch(err => {
 | |
| 					this.loading = false
 | |
| 					this.loadTitle = '加载更多'
 | |
| 				});
 | |
| 			},
 | |
|       /**
 | |
|        * 获得热门推荐
 | |
|        */
 | |
| 			getHostProduct: function() {
 | |
| 				if (!this.isScroll) {
 | |
|           return
 | |
|         }
 | |
|         ProductSpuApi.getSpuPage({
 | |
|           recommendType: 'hot',
 | |
|           pageNo: this.hotPage,
 | |
|           pageSize: this.limit
 | |
|         }).then(res => {
 | |
|           const good_list = res.data.list;
 | |
|           this.isScroll = good_list.length >= this.limit
 | |
|           this.hotPage += 1;
 | |
|           // 设置营销活动
 | |
|           const spuIds = good_list.map(item => item.id);
 | |
|           if (spuIds.length > 0) {
 | |
|             PromotionActivityApi.getActivityListBySpuIds(spuIds).then(res => {
 | |
|               ProductUtil.setActivityList(good_list, res.data);
 | |
|               this.hostProduct = this.hostProduct.concat(good_list); // 放在此处,避免 Vue 监控不到数组里的元素变化
 | |
|             });
 | |
|           }
 | |
| 				});
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| </script>
 | |
| <style lang="scss">
 | |
| 	page {
 | |
| 		background-color: #fff !important;
 | |
| 	}
 | |
| 
 | |
| 	.searchGood .search {
 | |
| 		padding-left: 30rpx;
 | |
| 		background-color: #fff !important;
 | |
| 	}
 | |
| 
 | |
| 	.searchGood .search {
 | |
| 		padding-top: 20rpx;
 | |
| 	}
 | |
| 
 | |
| 	.searchGood .search .input {
 | |
| 		width: 598rpx;
 | |
| 		background-color: #f7f7f7;
 | |
| 		border-radius: 33rpx;
 | |
| 		padding: 0 35rpx;
 | |
| 		box-sizing: border-box;
 | |
| 		height: 66rpx;
 | |
| 	}
 | |
| 
 | |
| 	.searchGood .search .input input {
 | |
| 		width: 472rpx;
 | |
| 		font-size: 26rpx;
 | |
| 	}
 | |
| 
 | |
| 	.searchGood .search .input .placeholder {
 | |
| 		color: #bbb;
 | |
| 	}
 | |
| 
 | |
| 	.searchGood .search .input .iconfont {
 | |
| 		color: #000;
 | |
| 		font-size: 35rpx;
 | |
| 	}
 | |
| 
 | |
| 	.searchGood .search .bnt {
 | |
| 		width: 120rpx;
 | |
| 		text-align: center;
 | |
| 		height: 66rpx;
 | |
| 		line-height: 66rpx;
 | |
| 		font-size: 30rpx;
 | |
| 		color: #282828;
 | |
| 	}
 | |
| 
 | |
| 	.searchGood .title {
 | |
| 		font-size: 28rpx;
 | |
| 		color: #999;
 | |
| 		margin: 50rpx 30rpx 25rpx 30rpx;
 | |
| 	}
 | |
| 
 | |
| 	.searchGood .list {
 | |
| 		padding-left: 10rpx;
 | |
| 	}
 | |
| 
 | |
| 	.searchGood .list .item {
 | |
| 		font-size: 26rpx;
 | |
| 		color: #454545;
 | |
| 		padding: 0 21rpx;
 | |
| 		height: 60rpx;
 | |
| 		border-radius: 30rpx;
 | |
| 		line-height: 60rpx;
 | |
| 		border: 1rpx solid #aaa;
 | |
| 		margin: 0 0 20rpx 20rpx;
 | |
| 	}
 | |
| 
 | |
| 	.searchGood .line {
 | |
| 		border-bottom: 1rpx solid #eee;
 | |
| 		margin: 20rpx 30rpx 0 30rpx;
 | |
| 	}
 | |
| </style>
 |