uni-app:购物车页面--结算区域
创始人
2025-05-30 02:54:03

把结算区域封装为组件

在 components 目录中,新建 my-settle 结算组件:

 初始化 my-settle 组件的基本结构和样式:

 在 cart.vue 页面中使用自定义的 my-settle 组件,并美化页面样式,防止页面底部被覆盖:

渲染结算区域的结构和样式 

定义如下的 UI 结构:


合计:¥1234.00结算(0)

美化样式:

.my-settle-container {position: fixed;bottom: 0;left: 0;width: 100%;height: 50px;// 将背景色从 cyan 改为 whitebackground-color: white;display: flex;justify-content: space-between;align-items: center;padding-left: 5px;font-size: 14px;.radio {display: flex;align-items: center;}.amount {color: #c00000;}.btn-settle {height: 50px;min-width: 100px;background-color: #c00000;color: white;line-height: 50px;text-align: center;padding: 0 10px;}
}

 

  动态渲染已勾选商品的总数量

在 store/cart.js 模块中,定义一个名称为 checkedCount 的 getters,用来统计已勾选商品的总数量:

// 勾选的商品的总数量
checkedCount(state) {// 先使用 filter 方法,从购物车中过滤器已勾选的商品// 再使用 reduce 方法,将已勾选的商品总数量进行累加// reduce() 的返回值就是已勾选的商品的总数量return state.cart.filter(x => x.goods_state).reduce((total, item) => total += item.goods_count, 0)
}

在 my-settle 组件中,通过 mapGetters 辅助函数,将需要的 getters 映射到当前组件中使用:

import { mapGetters } from 'vuex'export default {computed: {...mapGetters('m_cart', ['checkedCount']),},data() {return {}},
}

将 checkedCount 的值渲染到页面中:


结算({{checkedCount}})

 动态渲染全选按钮的选中状态

使用 mapGetters 辅助函数,将商品的总数量映射到当前组件中使用,并定义一个叫做 isFullCheck 的计算属性:

import { mapGetters } from 'vuex'export default {computed: {// 1. 将 total 映射到当前组件中...mapGetters('m_cart', ['checkedCount', 'total']),// 2. 是否全选isFullCheck() {return this.total === this.checkedCount},},data() {return {}},
}

 为 radio 组件动态绑定 checked 属性的值:


 

 ​​​​​​​​​​​​​​

  改造成功

实现商品的全选/反选功能 

在 store/cart.js 模块中,定义一个叫做 updateAllGoodsState 的 mutations 方法,用来修改所有商品的勾选状态:

// 更新所有商品的勾选状态
updateAllGoodsState(state, newState) {// 循环更新购物车中每件商品的勾选状态state.cart.forEach(x => x.goods_state = newState)// 持久化存储到本地this.commit('m_cart/saveToStorage')
}

在 my-settle 组件中,通过 mapMutations 辅助函数,将需要的 mutations 方法映射到当前组件中使用:

// 1. 按需导入 mapMutations 辅助函数
import { mapGetters, mapMutations } from 'vuex'export default {// 省略其它代码methods: {// 2. 使用 mapMutations 辅助函数,把 m_cart 模块提供的 updateAllGoodsState 方法映射到当前组件中使用...mapMutations('m_cart', ['updateAllGoodsState']),},
}

为 UI 中的 label 组件绑定 click 事件处理函数:


 在 my-settle 组件的 methods 节点中,声明 changeAllState 事件处理函数:

methods: {...mapMutations('m_cart', ['updateAllGoodsState']),// label 的点击事件处理函数changeAllState() {// 修改购物车中所有商品的选中状态// !this.isFullCheck 表示:当前全选按钮的状态取反之后,就是最新的勾选状态this.updateAllGoodsState(!this.isFullCheck)}
}

 动态渲染已勾选商品的总价格

在 store/cart.js 模块中,定义一个叫做 checkedGoodsAmount 的 getters,用来统计已勾选商品的总价格:

// 已勾选的商品的总价
checkedGoodsAmount(state) {// 先使用 filter 方法,从购物车中过滤器已勾选的商品// 再使用 reduce 方法,将已勾选的商品数量 * 单价之后,进行累加// reduce() 的返回值就是已勾选的商品的总价// 最后调用 toFixed(2) 方法,保留两位小数return state.cart.filter(x => x.goods_state).reduce((total, item) => total += item.goods_count * item.goods_price, 0).toFixed(2)
}

在 my-settle 组件中,使用 mapGetters 辅助函数,把需要的 checkedGoodsAmount 映射到当前组件中使用:

...mapGetters('m_cart', ['total', 'checkedCount', 'checkedGoodsAmount'])

在组件的 UI 结构中,渲染已勾选的商品的总价:


合计:¥{{checkedGoodsAmount}}

 

 

 动态计算购物车徽标的数值

问题说明:当修改购物车中商品的数量之后,tabBar 上的数字徽标不会自动更新。

解决方案:改造 mixins/tabbar-badge.js 中的代码,使用 watch 侦听器,监听 total 总数量的变化,从而动态为 tabBar 的徽标赋值:

import { mapGetters } from 'vuex'// 导出一个 mixin 对象
export default {computed: {...mapGetters('m_cart', ['total']),},watch: {// 监听 total 值的变化total() {// 调用 methods 中的 setBadge 方法,重新为 tabBar 的数字徽章赋值this.setBadge()},},onShow() {// 在页面刚展示的时候,设置数字徽标this.setBadge()},methods: {setBadge() {// 调用 uni.setTabBarBadge() 方法,为购物车设置右上角的徽标uni.setTabBarBadge({index: 2,text: this.total + '', // 注意:text 的值必须是字符串,不能是数字})},},
}

 

 渲染购物车为空时的页面结构

  1. 将 资料 目录中的 cart_empty@2x.png 图片复制到项目的 /static/ 目录中

  2. 改造 cart.vue 页面的 UI 结构,使用 v-if 和 v-else 控制购物车区域空白购物车区域的按需展示:

美化空白购物车区域的样式:

.empty-cart {display: flex;flex-direction: column;align-items: center;padding-top: 150px;.empty-img {width: 90px;height: 90px;}.tip-text {font-size: 12px;color: gray;margin-top: 15px;}
}

 

 分支的合并与提交

将 cart 分支进行本地提交:

git add .
git commit -m "完成了购物车的开发"

将本地的 cart 分支推送到码云: 

git push -u origin cart

将本地 cart 分支中的代码合并到 master 分支:

git checkout master
git merge cart
git push

删除本地的 cart 分支:

git branch -d cart

 

 

相关内容

热门资讯

JUC并发编程随记二——Com... 1、CompletableFuture 1.1、简介 JDK8设计出CompletableFutur...
148.网络安全渗透测试—[C... 我认为:无论是学习安全还是从事安全的人,多多少少都有些许的情怀和使命感&...
川藏线最新路况(川藏线实时路况... 本篇文章极速百科给大家谈谈川藏线最新路况,以及川藏线实时路况播报对应的知识点,希望对各位有所帮助,不...
洛克王国VIP的特权要详细(洛... 本篇文章极速百科给大家谈谈洛克王国VIP的特权要详细,以及洛克王国vip利益最大化对应的知识点,希望...
华为OD机试 - 货币单位换算... 最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真...
ZIC摩托车赛是什么样的竞争?... 本篇文章极速百科给大家谈谈ZIC摩托车赛是什么样的竞争?王一博为什么出名?,以及王一博赛摩托车视频对...
私家车广告怎么贴接车身广告才不... 今天给各位分享私家车广告怎么贴接车身广告才不违法的知识,其中也会对私家车贴广告属于哪个部门管进行解释...
图形视图框架的坐标 图形视图基于笛卡尔坐标系;项目在场景中的位置和几何图形由两组数字表示:X 坐标和 Y ...
SPSS 26安装包下载及详细... [软件名称]:SPSS 26 [软件大小]: 566 MB [安装环境]: Win11/Win 10...
C语言/文件 博客制作不易,欢迎各位点赞👍+收藏⭐+关注一、文件缓冲...
从《超级马里奥酷跑》看马里奥的... 今天给各位分享从《超级马里奥酷跑》看马里奥的发展史的知识,其中也会对超级马里奥演变史进行解释,如果能...
包含fbiwarning是什么... 本篇文章极速百科给大家谈谈fbiwarning是什么梗,以及对应的知识点,希望对各位有所帮助,不要忘...
奥迪a3保养周期,奥迪a3保养... 今天给各位分享奥迪a3保养周期,奥迪a3保养费用明细表的知识,其中也会对奥迪a3保养周期及费用进行解...
洋县这140名车主请注意,交警... 本篇文章极速百科给大家谈谈洋县这140名车主请注意,交警喊你来一趟!,以及洋县车祸最新对应的知识点,...
Faster RCNN 对血液... 目录 1. 介绍 2. 工具函数介绍 utils 2.1 xml 文件的读取 get_label_f...
Progress ThemeB... Progress ThemeBuilder updated Crack   增加了对jQuery的K...
特大交通事故的标准是什么的简单... 本篇文章极速百科给大家谈谈特大交通事故的标准是什么,以及对应的知识点,希望对各位有所帮助,不要忘了收...
江淮全新SUV实车亮相,有望定... 本篇文章极速百科给大家谈谈江淮全新SUV实车亮相,有望定价在10万左右,以及江淮最新款suv对应的知...
10万以内家用车哪款好五款热门... 本篇文章极速百科给大家谈谈10万以内家用车哪款好五款热门10万以内家用车介绍,以及十万以内家用车什么...
运动鞋可以水洗吗(耐克运动鞋可... 本篇文章极速百科给大家谈谈运动鞋可以水洗吗,以及耐克运动鞋可以水洗吗对应的知识点,希望对各位有所帮助...
Spring学习(五) 事物管理: 一、事物管理的回顾: 1、事物的概念: 事物&...
python练习题5.0 1、给定一个包含n+1个整数的数组nums,其数字在1到n之间(...
django-celery-b... 一、创建django项目和app 1、安装定时任务第三方包 pip install django-c...
立刻有是什么意思(唐人街探案2... 今天给各位分享立刻有是什么意思的知识,其中也会对唐人街探案2立刻有是什么意思进行解释,如果能碰巧解决...
上海车zheng震最佳地点(上... 今天给各位分享上海车zheng震最佳地点的知识,其中也会对上海车辆振动检测电话进行解释,如果能碰巧解...
秦国历代国君及姓名皇帝列表(秦... 今天给各位分享秦国历代国君及姓名皇帝列表的知识,其中也会对秦国历代国君及姓名介绍进行解释,如果能碰巧...
摩托车高温后自动熄火baiku... 本篇文章极速百科给大家谈谈摩托车高温后自动熄火baiku白酷,以及摩托发动机高温自动熄火对应的知识点...
REDIS18_ ①. ZipList是一种特殊的"双端链表" ,由一系列特殊编码的连续内存块组成。可以在任意一端进行...
外贸优化排名稳定吗?外贸网站如... 外贸优化排名稳定吗? 答案是:稳定。 当然这是针对持续做谷歌SEO排名优...
浅谈C库函数——memcpy、...   💌内容专栏:【C语言】进阶部分 💌本文概括&#...