Parcourir la source

完成商品列表页面

一个番茄酱 il y a 2 ans
Parent
commit
7d53c0c0e6
3 fichiers modifiés avec 158 ajouts et 4 suppressions
  1. 76 0
      components/my-goods/my-goods.vue
  2. 3 2
      pages.json
  3. 79 2
      subpkg/goods_list/goods_list.vue

+ 76 - 0
components/my-goods/my-goods.vue

@@ -0,0 +1,76 @@
+<template>
+	<view>
+		<view class="goods-item">
+			<!-- 商品左侧图片区域 -->
+			<view class="goods-item-left">
+				<image :src="goods.goods_small_logo || defaultPic" class="goods-pic"></image>
+			</view>
+			<!-- 商品右侧信息区域 -->
+			<view class="goods-item-right">
+				<!-- 商品标题 -->
+				<view class="goods-name">{{goods.goods_name}}</view>
+				<view class="goods-info-box">
+					<!-- 商品价格 -->
+					<view class="goods-price">¥{{goods.goods_price | tofixed}}</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name:"my-goods",
+		// 定义 props 属性,用来接收外界传递到当前组件的数据
+		props: {
+			// 商品的信息对象
+			goods: {
+				type: Object,
+				defaul: {},
+			},
+		},
+		data() {
+			return {
+				defaultPic: 'https://img3.doubanio.com/f/movie/8dd0c794499fe925ae2ae89ee30cd225750457b4/pics/movie/celebrity-default-medium.png',
+			};
+		},
+		filters: {
+			// 把数字处理为带两位小数点的数字
+			tofixed(num) {
+				return Number(num).toFixed(2)
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+.goods-item {
+	display: flex;
+	padding: 10px 5px;
+	border-bottom: 1px solid #f0f0f0;
+	
+	.goods-item-left {
+		margin-right: 5px;
+		
+		.goods-pic {
+			width: 100px;
+			height: 100px;
+			display: block;
+		}
+	}
+	
+	.goods-item-right {
+		display: flex;
+		flex-direction: column;
+		justify-content: space-between;
+		
+		.goods-name {
+			font-size: 13px;
+		}
+		.goods-price {
+			font-size: 16px;
+			color: #c00000;
+		}
+	}
+}
+</style>

+ 3 - 2
pages.json

@@ -51,8 +51,9 @@
 				    "path" : "subpkg/goods_list/goods_list",
 				    "path" : "subpkg/goods_list/goods_list",
 				    "style" :                                                                                    
 				    "style" :                                                                                    
 				    {
 				    {
-				        "navigationBarTitleText": "",
-				        "enablePullDownRefresh": false
+						"onReachBottomDistance": 150,
+				        "enablePullDownRefresh": true,
+				        "backgroundColor": "#F8F8F8"
 				    }
 				    }
 				    
 				    
 				}
 				}

+ 79 - 2
subpkg/goods_list/goods_list.vue

@@ -1,6 +1,11 @@
 <template>
 <template>
 	<view>
 	<view>
-		
+		<view class="goods-list">
+			<block v-for="(items, i) in goodsList" :key="i" @click="gotoDetail(item)">
+				<!-- 为 my-goods 组件动态绑定 goods 属性的值 -->
+				<my-goods :goods="item"></my-goods>
+			</block>
+		</view>
 	</view>
 	</view>
 </template>
 </template>
 
 
@@ -8,8 +13,80 @@
 	export default {
 	export default {
 		data() {
 		data() {
 			return {
 			return {
-				
+				// 请求参数对象
+				queryObj: {
+					// 查询关键词
+					query: '',
+					// 商品分类Id
+					cid: '',
+					// 页码值
+					pagenum: 1,
+					// 每页显示多少条数据
+					pagesize: 10
+				},
+				// 商品列表的数据
+				goodsList: [],
+				// 总数量,用来实现分页
+				total: 0,
+				// 是否正在请求数据
+				isloading: false
 			};
 			};
+		},
+		onLoad(options) {
+			// 将页面参数转存到 this.queryObj 对象中
+			this.queryObj.query = options.query || ''
+			this.queryObj.cid = options.cid || ''
+			// 调用获取商品列表数据的方法
+			this.getGoodsList()
+		},
+		methods: {
+			// 获取商品列表数据的方法
+			async getGoodsList(cb) {
+				// ** 打开节流阀
+				this.isloading = true
+				// 发起请求
+				const { data: res } = await
+				uni.$http.get('/api/public/v1/goods/search', this.queryObj)
+				// ** 关闭节流阀
+				this.isloading = false
+				// 只要数据请求完毕,就立即按需调用 cb 回调函数
+				cb && cb()
+				
+				if (res.meta.status !== 200) return uni.$showMsg()
+				// 为数据赋值:通过展开运算符的形式,进行新旧数据的拼接
+				this.goodsList = [...this.goodsList, ...res.message.goods]
+				this.total = res.message.total
+			},
+			// 触底的事件
+			onReachBottom() {
+				// 判断是否还有下一页数据
+				if (this.queryObj.pagenum * this.queryObj.pagesize >= this.total)
+				return uni.$showMsg('数据加载完毕!')
+				
+				// 判断是否正在请求其它数据,如果是,则不发起额外的请求
+				if (this.isloading) return
+				
+				// 让页码值自增 +1
+				this.queryObj.pagenum += 1
+				// 重新获取列表数据
+				this.getGoodsList()
+			},
+			// 下拉刷新的事件
+			onPullDownRefresh() {
+				// 1. 重置关键数据
+				this.queryObj.pagenum = 1
+				this.total = 0
+				this.isloading = false
+				this.goodsList = []
+				// 2. 重新发起请求
+				this.getGoodsList(() => uni.stopPullDownRefresh())
+			},
+			// 点击跳转到商品详情页面
+			gotoDetail(item) {
+				uni.navigateTo({
+					url: '/subpkg/goods_detail/goods_detail?goods_id=' + item.goods_id
+				})
+			}
 		}
 		}
 	}
 	}
 </script>
 </script>