个人名片:
🐼作者简介:一名大二在校生,讨厌编程🎋
🐻❄️个人主页🥇:小新爱学习.
🐼个人WeChat:hmmwx53
🕊️系列专栏:🖼️
- 零基础学Java——小白入门必备
- 重识C语言——复习回顾
- 计算机网络体系———深度详讲
- 微信小程序开发——实战开发
- 基于黑马优选的小程序开发实战教程
🐓每日一句:🍭努力的意义是给所爱之人一个美好的未来!
运行如下的命令,基于 master
分支在本地创建 goodsdetail
子分支,用来开发商品详情页相关的功能:
git checkout -b goodsdetail
添加编译模式
选项:启动页面
的路径,并填写了 启动参数
之后,点击 确定
按钮,添加详情页面的编译模式:data
中定义商品详情的数据节点:data() {return {// 商品详情对象goods_info: {}}
}
onLoad
中获取商品的 Id
,并调用请求商品详情的方法:onLoad(options) {// 获取商品 Idconst goods_id = options.goods_id// 调用请求商品详情数据的方法this.getGoodsDetail(goods_id)
}
methods
中声明 getGoodsDetail
方法:methods: {// 定义请求商品详情数据的方法async getGoodsDetail(goods_id) {const { data: res } = await uni.$http.get('/api/public/v1/goods/detail', { goods_id })if (res.meta.status !== 200) return uni.$showMsg()// 为 data 中的数据赋值this.goods_info = res.message}
}
v-for
指令,循环渲染如下的轮播图 UI
结构:
swiper {height: 750rpx;image {width: 100%;height: 100%;}
}
image
图片绑定 click
事件处理函数:
methods
中定义 preview
事件处理函数:// 实现轮播图的预览效果
preview(i) {// 调用 uni.previewImage() 方法预览图片uni.previewImage({// 预览时,默认显示图片的索引current: i,// 所有图片 url 地址的数组urls: this.goods_info.pics.map(x => x.pics_big)})
}
UI
结构如下:
¥{{goods_info.goods_price}} {{goods_info.goods_name}} 收藏 快递:免运费
// 商品信息区域的样式
.goods-info-box {padding: 10px;padding-right: 0;.price {color: #c00000;font-size: 18px;margin: 10px 0;}.goods-info-body {display: flex;justify-content: space-between;.goods-name {font-size: 13px;padding-right: 10px;}// 收藏区域.favi {width: 120px;font-size: 12px;display: flex;flex-direction: column;justify-content: center;align-items: center;border-left: 1px solid #efefef;color: gray;}}// 运费.yf {margin: 10px 0;font-size: 12px;color: gray;}
}
rich-text
组件,将带有 HTML
标签的内容,渲染为小程序的页面结构:
getGoodsDetail
方法,从而解决图片底部 空白间隙
的问题:// 定义请求商品详情数据的方法
async getGoodsDetail(goods_id) {const { data: res } = await uni.$http.get('/api/public/v1/goods/detail', { goods_id })if (res.meta.status !== 200) return uni.$showMsg()// 使用字符串的 replace() 方法,为 img 标签添加行内的 style 样式,从而解决图片底部空白间隙的问题res.message.goods_introduce = res.message.goods_introduce.replace(/![]()
.webp
格式图片在 ios
设备上无法正常显示的问题:// 定义请求商品详情数据的方法
async getGoodsDetail(goods_id) {const { data: res } = await uni.$http.get('/api/public/v1/goods/detail', { goods_id })if (res.meta.status !== 200) return uni.$showMsg()// 使用字符串的 replace() 方法,将 webp 的后缀名替换为 jpg 的后缀名res.message.goods_introduce = res.message.goods_introduce.replace(/![]()
导致问题的原因:在商品详情数据请求回来之前,data
中 goods_info
的值为 {}
,因此初次渲染页面时,会导致 商品价格、商品名称
等闪烁的问题。
解决方案:判断 goods_info.goods_name
属性的值是否存在,从而使用 v-if
指令控制页面的显示与隐藏:
基于 uni-ui
提供的 GoodsNav
组件来实现商品导航区域的效果
在 data
中,通过 options
和 buttonGroup
两个数组,来声明商品导航组件的按钮配置对象:
data() {return {// 商品详情对象goods_info: {},// 左侧按钮组的配置对象options: [{icon: 'shop',text: '店铺'}, {icon: 'cart',text: '购物车',info: 2}],// 右侧按钮组的配置对象buttonGroup: [{text: '加入购物车',backgroundColor: '#ff0000',color: '#fff'},{text: '立即购买',backgroundColor: '#ffa200',color: '#fff'}]}
}
uni-goods-nav
商品导航组件:
.goods-detail-container {// 给页面外层的容器,添加 50px 的内padding,// 防止页面内容被底部的商品导航组件遮盖padding-bottom: 50px;
}.goods_nav {// 为商品导航组件添加固定定位position: fixed;bottom: 0;left: 0;width: 100%;
}
uni-goods-nav
的 @click
事件处理函数,事件对象 e
中会包含当前点击的按钮相关的信息:// 左侧按钮的点击事件处理函数
onClick(e) {console.log(e)
}
e.content.text
的值,来决定进一步的操作:// 左侧按钮的点击事件处理函数
onClick(e) {if (e.content.text === '购物车') {// 切换到购物车页面uni.switchTab({url: '/pages/cart/cart'})}
}
goodsdetail
分支进行本地提交:git add .
git commit -m "完成了商品详情页面的开发"
goodsdetail
分支推送到码云:git push -u origin goodsdetail
goodsdetail
分支中的代码合并到 master
分支:git checkout master
git merge goodsdetail
git push
goodsdetail
分支:git branch -d goodsdetail