商城小程序(5.商品列表)

目录

  • 一、定义请求参数对象
  • 二、获取商品列表数据
  • 三、渲染商品列表结构
  • 四、把商品item封装为自定义组件
  • 五、使用过滤器处理价格
  • 六、上拉加载更多
  • 七、下拉刷新
  • 八、点击商品item项跳转到详情页面

这章主要完成商品列表页面的编写:位于subpkg分包下的goods_list页面
在这里插入图片描述

一、定义请求参数对象

先看一下我们需要用到的后端api接口:商品列表搜索
在这里插入图片描述

返回结果

在这里插入图片描述
在这里插入图片描述
现在开始写前端:因为向后端发送请求,需要4个参数,所以我们可以先封装一个对象

在这里插入图片描述

<script>export default {data() {return {// 请求参数对象queryObj: {// 查询关键字query: '',// 商品分类idcid: '',// 页码值pagenum: 1,// 每页显示多少条数据pagesize: 10,}};},onLoad(options) {// 将页面参数转存到 this.queryobj对象中this.queryObj.query = options.query || ''this.queryObj.cid = options.cid || ''}}
</script>

二、获取商品列表数据

在这里插入图片描述
3.在methods中定义getGoodsList方法

		methods: {// 获取商品列表方法async getGoodsList() {const {data : res} = await uni.request({url: 'https://api-hmugo-web.itheima.net/api/public/v1/goods/search',data: this.queryObj,method: 'GET',})if (res.meta.status !== 200) {return uni.showToast({title: '数据请求失败!',duration: 1500,icon: 'none',})}this.goodsList = res.message.goodsthis.total = res.message.total}}

三、渲染商品列表结构

在页面,通过v-for指令,渲染出商品的UI结构:

<template><view><view class="goods-list"><block v-for="(goods, i) in goodsList" :key='i'><view class="goods-item"><!--左侧盒子--><view class="goods-item-left"><image :src="goods.goods_small_logo" 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}}</view></view></view></view></block></view></view>
</template>

美化ui

<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-info-box{.goods-price{color: #C00000;font-size: 16px;}}}}</style>

查看界面(首页,分类页随便点一个进去看)

在这里插入图片描述
在这里插入图片描述

四、把商品item封装为自定义组件

创建my-goods自定义组件

在这里插入图片描述

将从block下开始的UI全部抽取出来(style也同理),复制到新组件my-goods统一管理,并调用my-goods自定义组件

在这里插入图片描述
在这里插入图片描述

my-goods组件:不同点,定义一个props用于接受参数

<template><view class="goods-item"><!--左侧盒子--><view class="goods-item-left"><image :src="goods.goods_small_logo" 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}}</view></view></view></view>
</template><script>export default {name: "my-goods",props: {goods: {type: Object,default: {}}},data() {return {};}}
</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-info-box{.goods-price{color: #C00000;font-size: 16px;}}}}
</style>

封装完成也能正常展示页面:

在这里插入图片描述

五、使用过滤器处理价格

在这里插入图片描述

六、上拉加载更多

1.打开项目根目录中的pages.json配置文件,为subPackages分包中的goods_list 页面配置上拉触底的距离:

在这里插入图片描述

2.在goods_list页面中,和methods节点平级,声明onReachBottom事件处理函数,用来监听页面的上拉触底行为

		onReachBottom() {// 让页面值自增this.queryObj.pagenum++// 重新获取列表数据this.getGoodsList()}

3.改造methods中的getGoodsList函数,当请求成功之后,进行新旧数据的拼接处理
在这里插入图片描述

上拉页面,就可以加载后面页码的内容数据,获取之前无法展示的数据了。

在这里插入图片描述
这里存在一些问题需要解决: 当我们一直往下滑动请求数据时,会频繁的向我们后台发送请求获取数据,可能我们第二页还没加载完,就在发送第五页数据请求了。

在这里插入图片描述
所以我们需要等待第二页数据完,后续的请求都不能发起,这样才比较合理

我们可以通过开启节流阀防止发起额外的请求:
在这里插入图片描述

在请求数据前后打开关闭节流阀

在这里插入图片描述

在触发触底事件时,要判断节流阀是否开启

在这里插入图片描述
还有个bug:当我们页面加载完时,再上拉获取数据,还是会发送新的页面请求,但实际我们后台的pagenum已经到最后一页(只有3页数据,但在发送第四页请求),所以我们还要判断数据是否获取完毕

在这里插入图片描述

解决这个问题也很简单

在这里插入图片描述

在这里插入图片描述
这样就比较合理,数据加载完,不会发送新数据,再去获取列表
在这里插入图片描述

七、下拉刷新

enablePullDownRefresh:表示开启当前页面的下拉刷新功能

在这里插入图片描述
2.监听页面的onPullDownRefresh事件:(如果发生下拉事件,刷新数据)与methods平级创建
在这里插入图片描述

		onPullDownRefresh() {// 重置关键数据this.queryObj.pagenum = 1this.total = 0this.isloading = falsethis.goodsList = []// 重新发起数据请求this.getGoodsList(() => uni.stopPullDownRefresh())}

3.修改getGoodsList函数,接受cb回调函数并按需进行调用

在这里插入图片描述

上拉刷新,重置我们之前发送的请求(比如之前如果向下获取过第二页,第三页数据就没了,只有第一页)
在这里插入图片描述

八、点击商品item项跳转到详情页面

前面做过很多了,很简单
在这里插入图片描述

点击成功跳转
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/598225.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【竞技宝】DOTA2:二号位地位发生变化 圣斧、血棘助法核重回巅峰!

北京时间2024年1月5日&#xff0c;目前国服已经更新7.35b版本一段时间了&#xff0c;在这段时间里&#xff0c;各位看官是否感受到了比赛节奏和英雄胜率方面的变化呢&#xff1f;从全分段的出场率以及胜率的变化来看&#xff0c;二号位在游戏内的地位已经发生了很大的变化。 在…

DrGraph原理示教 - OpenCV 4 功能 - 膨胀腐蚀

在二值图的结果基础上&#xff0c;可针对性处理。 这些处理有些是概念上的&#xff0c;有些是原理上的&#xff0c;也有形态上的&#xff0c;那就看用途与目的了。 本质上还是对二值图的黑白点进行处理&#xff0c;以用于图像增强、边缘检测、图像分割等多个领域。比如膨胀与腐…

Capsolver:解决Web爬虫中CAPTCHA挑战的最优解决方案

Web爬虫已经成为从各种在线来源提取和分析数据的不可或缺的技术。然而&#xff0c;在Web爬取过程中&#xff0c;经常会遇到的一个共同挑战是CAPTCHA。CAPTCHA&#xff08;完全自动化的公共图灵测试&#xff0c;用于区分计算机和人类&#xff09;是一种安全措施&#xff0c;旨在…

vue3中使用elementplus中的el-tree-select,自定义显示名称label

<el-tree-select v-model"addPval" node-key"id" :data"menulists" :render-after-expand"false" :props"menuProps" /> <el-divider />let menuProps {//自定义labellabel: (data: { name: any; }) > {ret…

web期末个人引导页透明版

效果图 代码 css代码 * {box-sizing: border-box; }body {color: #2b2c48;font-family: "Jost", sans-serif;background-image: url(../img/bg.jpg);background-repeat: no-repeat;background-size: cover;background-position: center;background-attachment: fix…

杨中科 ASP.NETCore开发效率利器 HOT RELOAD

HOT RELOAD 1、困惑:修改了服务器端的代码&#xff0c;必须重新运行程序。 2、方法1: [启动 (不调试) ] 3、方法2: .NET 6开始的Hot Reload(热重载) 正常修改代码后 不重启&#xff0c;是无法看到新的数据展示在页面 修改 运行结果&#xff1a; 方式一&#xff1a;设置开始…

java+vue+uniapp开发的前后端分离社交论坛问答发帖

源码介绍&#xff1a; 前后端分离社交论坛问答发帖BBS源码&#xff0c;社交论坛小程序|H5论坛| app论坛是javavueuniapp开发的前后端分离社交论坛问答发帖/BBS项目&#xff0c; 包括论坛图文帖&#xff0c;视频&#xff0c;圈子&#xff0c;IM私聊&#xff0c;微信支付&…

PyTorch数据并行(DP/DDP)浅析

一直以来都是用的单机单卡训练模型&#xff0c;虽然很多情况下已经足够了&#xff0c;但总有一些情况得上分布式训练&#xff1a; 模型大到一张卡放不下&#xff1b;单张卡batch size不敢设太大&#xff0c;训练速度慢&#xff1b;当你有好几张卡&#xff0c;不想浪费&#xf…

java SSM水质历史数据可视化设计myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM水质历史数据可视化设计是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主…

k_d树, KNN算法学习笔记_1 距离和范数

k_d树, KNN算法学习笔记_1 距离和范数 二维树中最近邻搜索的示例。这里&#xff0c;树已经构建好了&#xff0c;每个节点对应一个矩形&#xff0c;每个矩形被分割成两个相等的子矩形&#xff0c;叶子对应于包含单个点的矩形 From Wikipedia 1&#xff0e; k k k近邻法是基本且简…

Elasticsearch:Serarch tutorial - 使用 Python 进行搜索 (一)

本实践教程将教你如何使用 Elasticsearch 构建完整的搜索解决方案。 在本教程中你将学习&#xff1a; 如何对数据集执行全文关键字搜索&#xff08;可选使用过滤器&#xff09;如何使用机器学习模型生成、存储和搜索密集向量嵌入如何使用 ELSER 模型生成和搜索稀疏向量如何使用…

Nginx 简介和入门 - part1

虽然作为1个后端程序员&#xff0c; 终究避不开这东西 安装Nginx 本人的测试服务器是debian &#xff0c; 安装过程跟ubuntu基本一样 sudo apt-get install nginx问题是 nginx 安装后 执行文件在/usr/sbin 而不是/usr/bin 所以正常下普通用户是无法使用的。 必须切换到root…

C练习——定期存取并行

题目&#xff1a;假设银行一年整存零取的月息为1.875%&#xff0c;现在某人手头有一笔钱&#xff0c;他打算在今后5年 中&#xff0c;每年年底取出1000元作为孩子来年的教育金&#xff0c;到第5年孩子毕业时刚好取完这笔钱&#xff0c;请编 程计算第1年年初时他应存入银行多少钱…

深度学习课程实验三训练和测试卷积神经网络

一、 实验目的 1、学会搭建、训练和测试卷积神经网络&#xff0c;并掌握其应用。 2、掌握使用numpy实现卷积(CONV)和池化(POOL)层&#xff0c;包括正向春传播和反向传播。 二、 实验步骤 Convolutional Neural Networks: Step by Step 1、导入所需要的安装包 2、构建卷积神经…

RabbitMQ安装与应用

文章目录 1. RabbitMQ1.1. 同步通讯与异步通讯1.2. 异步通讯的优缺点1.3. 几种MQ的对比1.4. docker安装运行RabbitMQ 流程1.5. RabbitMQ的几个概念1.6. 五种模型1.6.1. 基本消息队列 1.7. 基本使用1.7.1. 1建立连接时会出现以下界面![在这里插入图片描述](https://img-blog.csd…

信息论与编码期末复习——概念论述简答题(一)

个人名片&#xff1a; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的在校大学生 &#x1f42f;个人主页&#xff1a;妄北y &#x1f427;个人QQ&#xff1a;2061314755 &#x1f43b;个人邮箱&#xff1a;2061314755qq.com &#x1f989;个人WeChat&#xff1a;V…

箱体透明屏的原理

箱体透明屏的原理主要是通过特殊的结构设计&#xff0c;使得屏幕具有透光性&#xff0c;从而实现在显示内容的同时保持箱体的透明效果。具体来说&#xff0c;箱体透明屏采用镂空结构的设计&#xff0c;将灯条一根根的排列成透明状&#xff0c;使得屏幕整体看起来具有透明感。在…

基于卷积神经网络的回归分析

目录 背影 卷积神经网络CNN的原理 卷积神经网络CNN的定义 卷积神经网络CNN的神经元 卷积神经网络CNN的激活函数 卷积神经网络CNN的传递函数 卷积神经网络的回归分析 完整代码:卷积神经网络的回归分析(代码完整,数据齐全)资源-CSDN文库 https://download.csdn.net/download/…

如何设置pygame窗口的标题

通过 pygame.display.set_caption("这是标题") 可以绘制窗口的标题 import pygame #导包 from pygame.locals import* import sysscreen_width600 screen_height600 pygame.init() #初始化 screen pygame.display.set_mode(size(screen_width,screen_height)) py…

postgresql可视化导入文件

不需要在命令行copy了&#xff0c;只需简单点几下 注意&#xff1a;要选清楚各列类型&#xff08;第6步&#xff09;&#xff0c;不然会出错&#xff01; 1.在数据库下建一个schema 右击选中数据库-new schema 2.双击你创建的schema&#xff0c;出现tables 3.右击tables&am…