【 uniapp - 黑马优购 | 购物车页面(3)】结算页面组件封装与渲染 (超详细代码讲解)

news2025/1/19 12:59:18

在这里插入图片描述


在这里插入图片描述


个人名片:

🐼作者简介:一名大二在校生,讨厌编程🎋
🐻‍❄️***个人主页🥇:***小新爱学习.
🐼***个人WeChat:见文末***
🕊️***系列专栏:🖼️***

  • 零基础学Java——小白入门必备
  • 重识C语言——复习回顾
  • 计算机网络体系———深度详讲
  • 微信小程序开发——实战开发
  • 基于黑马优选的小程序开发实战教程

🐓***每日一句:🍭***好想赚钱!!!


文章目录

    • 9.3 结算区域
      • 9.3.1 把结算区域封装为组件
      • 9.3.2 渲染结算区域的结构和样式
      • 9.3.3 动态渲染已勾选商品的总数量
      • 9.3.4 动态渲染全选按钮的选中状态
      • 9.3.5 实现商品的全选/反选功能
      • 9.3.6 动态渲染已勾选商品的总价格
      • 9.3.7 动态计算购物车徽标的数值
      • 9.3.8 渲染购物车为空时的页面结构
    • 9.4 分支的合并与提交
  • ==三连支持一下!==


9.3 结算区域

9.3.1 把结算区域封装为组件

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

在这里插入图片描述

  1. 初始化 my-settle 组件的基本结构和样式:
<template>
  <!-- 最外层的容器 -->
  <view class="my-settle-container">
    结算组件
  </view>
</template>

<script>
export default {
  data() {
    return {}
  },
}
</script>

<style lang="scss">
.my-settle-container {
  /* 底部固定定位 */
  position: fixed;
  bottom: 0;
  left: 0;
  /* 设置宽高和背景色 */
  width: 100%;
  height: 50px;
  background-color: cyan;
}
</style>
  1. cart.vue 页面中使用自定义的 my-settle 组件,并美化页面样式,防止页面底部被覆盖:
<template>
  <view class="cart-container">
    <!-- 使用自定义的 address 组件 -->

    <!-- 购物车商品列表的标题区域 -->

    <!-- 商品列表区域 -->

    <!-- 结算区域 -->
    <my-settle></my-settle>
  </view>
</template>

<style lang="scss">
.cart-container {
  padding-bottom: 50px;
}
</style>

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

  1. 定义如下的 UI 结构:
<!-- 最外层的容器 -->
<view class="my-settle-container">
  <!-- 全选区域 -->
  <label class="radio">
    <radio color="#C00000" :checked="true" /><text>全选</text>
  </label>

  <!-- 合计区域 -->
  <view class="amount-box">
    合计:<text class="amount">¥1234.00</text>
  </view>

  <!-- 结算按钮 -->
  <view class="btn-settle">结算(0)</view>
</view>
  1. 美化样式:
.my-settle-container {
  position: fixed;
  bottom: 0;
  left: 0;
  width: 100%;
  height: 50px;
  // 将背景色从 cyan 改为 white
  background-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;
  }
}

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

  1. store/cart.js 模块中,定义一个名称为 checkedCountgetters,用来统计已勾选商品的总数量:
// 勾选的商品的总数量
checkedCount(state) {
  // 先使用 filter 方法,从购物车中过滤器已勾选的商品
  // 再使用 reduce 方法,将已勾选的商品总数量进行累加
  // reduce() 的返回值就是已勾选的商品的总数量
  return state.cart.filter(x => x.goods_state).reduce((total, item) => total += item.goods_count, 0)
}
  1. my-settle 组件中,通过 mapGetters 辅助函数,将需要的 getters 映射到当前组件中使用:
import { mapGetters } from 'vuex'

export default {
  computed: {
    ...mapGetters('m_cart', ['checkedCount']),
  },
  data() {
    return {}
  },
}
  1. checkedCount 的值渲染到页面中:
<!-- 结算按钮 -->
<view class="btn-settle">结算({{checkedCount}})</view>

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

  1. 使用 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 {}
  },
}
  1. radio 组件动态绑定 checked 属性的值:
<!-- 全选区域 -->
<label class="radio">
  <radio color="#C00000" :checked="isFullCheck" /><text>全选</text>
</label>

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

  1. store/cart.js 模块中,定义一个叫做 updateAllGoodsStatemutations 方法,用来修改所有商品的勾选状态:
// 更新所有商品的勾选状态
updateAllGoodsState(state, newState) {
  // 循环更新购物车中每件商品的勾选状态
  state.cart.forEach(x => x.goods_state = newState)
  // 持久化存储到本地
  this.commit('m_cart/saveToStorage')
}
  1. my-settle 组件中,通过 mapMutations 辅助函数,将需要的 mutations 方法映射到当前组件中使用:
// 1. 按需导入 mapMutations 辅助函数
import { mapGetters, mapMutations } from 'vuex'

export default {
  // 省略其它代码
  methods: {
    // 2. 使用 mapMutations 辅助函数,把 m_cart 模块提供的 updateAllGoodsState 方法映射到当前组件中使用
    ...mapMutations('m_cart', ['updateAllGoodsState']),
  },
}
  1. UI 中的 label 组件绑定 click 事件处理函数:
<!-- 全选区域 -->
<label class="radio" @click="changeAllState">
  <radio color="#C00000" :checked="isFullCheck" /><text>全选</text>
</label>
在 my-settle 组件的 methods 节点中,声明 changeAllState 事件处理函数:

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

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

  1. store/cart.js 模块中,定义一个叫做 checkedGoodsAmountgetters,用来统计已勾选商品的总价格:
// 已勾选的商品的总价
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)
}
  1. my-settle 组件中,使用 mapGetters 辅助函数,把需要的 checkedGoodsAmount 映射到当前组件中使用:
...mapGetters('m_cart', ['total', 'checkedCount', 'checkedGoodsAmount'])
  1. 在组件的 UI 结构中,渲染已勾选的商品的总价:
<!-- 合计区域 -->
<view class="amount-box">
  合计:<text class="amount">¥{{checkedGoodsAmount}}</text>
</view>

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

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

2. 解决方案:改造 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 的值必须是字符串,不能是数字
      })
    },
  },
}

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

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

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

<template>
  <view class="cart-container" v-if="cart.length !== 0">

    <!-- 使用自定义的 address 组件 -->

    <!-- 购物车商品列表的标题区域 -->

    <!-- 商品列表区域 -->

    <!-- 结算区域 -->

  </view>

  <!-- 空白购物车区域 -->
  <view class="empty-cart" v-else>
    <image src="/static/cart_empty@2x.png" class="empty-img"></image>
    <text class="tip-text">空空如也~</text>
  </view>
</template>
  1. 美化空白购物车区域的样式:
.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;
  }
}

9.4 分支的合并与提交

  1. cart 分支进行本地提交:
git add .
git commit -m "完成了购物车的开发"
  1. 将本地的 cart 分支推送到码云:
git push -u origin cart
  1. 将本地 cart 分支中的代码合并到 master 分支:
git checkout master
git merge cart
git push
  1. 删除本地的 cart 分支:
git branch -d cart

三连支持一下!

在这里插入图片描述


在这里插入图片描述

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

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

相关文章

C语言 动态内存管理函数的 深度解析 #是不是对数组不能变大变小而烦恼呢?学会动态内存管理函数,消去数组耿直的烦恼#

文章目录前言为什么存在动态内存分配&#xff1f;malloc 和 free1.malloc2.free3.使用callocrealloc常见的动态内存错误1.对NULL指针的解引用操作2.对动态开辟空间的越界访问3.对非动态开辟内存使用free释放4.使用free释放一块动态开辟内存的一部分5.对同一块动态内存多次释放6…

启动优化·基础论·浅析 Android 启动优化

“ 【小木箱成长营】启动优化系列文章(排期中)&#xff1a; 启动优化 工具论 启动优化常见的六种工具 启动优化 方法论 这样做启动优化时长降低 70% 启动优化 实战论 手把手教你破解启动优化十大难题 ”一、引言 Hello&#xff0c;我是小木箱&#xff0c;欢迎来到小木箱成…

Transformer——day63 读论文:SST:用于多标签图像识别的空间和语义变压器

SST&#xff1a;用于多标签图像识别的空间和语义变压器SST&#xff1a;用于多标签图像识别的空间和语义变压器I. INTRODUCTIONII. RELATED WORKA. Multi-Label Image RecognitionB. Transformer in Computer VisionIII. APPROACHA. MotivationB. Recap of TransformerC. Modeli…

【Java寒假打卡】Java基础-多线程

【Java寒假打卡】Java基础-多线程概述读线程实现方式-继承Thread多线程实现方式-Callable三种实现方式的对比Thread方法守护线程线程的优先级概述 并发和并行 进程和线程 读线程实现方式-继承Thread 继承Thread类进行实现 package com.hfut.edu.test11;public class MyThr…

2022年最新年终奖个人所得税计算计算方法及扣税标准

1、2021年12月30号&#xff0c;国务院决定年终奖等三项个税优惠续期&#xff1a;http://www.gov.cn/zhengce/2021-12/30/content_5665553.htm2、税务总局公告2019年第35号《关于非居民个人和无住所居民个人有关个人所得税政策的公告》&#xff1a;http://www.gov.cn/zhengce/zh…

一、Django项目创建

一. Python项目虚拟环境创建 在项目开发过程中会下载很多第三方库&#xff0c;有时不同项目对同一个库的依赖版本不同&#xff0c;如果所有项目都使用同一个python环境就会起冲突不便于管理。因此&#xff0c;实际开发中会为每一个项目都单独创建一个python的虚拟环境。这里的…

多线程~POSIX信号量实现生产者消费者模型,PV操作

目录 1.信号量的概念 2.sem_t信号量的操作函数 &#xff08;1&#xff09;.原理 &#xff08;2&#xff09;.sem_t函数的使用 &#xff08;3&#xff09;.基于信号量和环形队列的生产者消费者模型 1&#xff09;.大致实现思路 Task.hpp circular_queue.hpp circular_c…

基于java SSH框架的简单医疗管理系统源码+数据库,医疗管理系统基于springmvc+spring+hibernate

医疗管理系统 基于java SSH框架的简单医疗管理系统 环境说明 1、语言及开发环境&#xff1a; 语言实现说明JAVA后端用springmvcspringhibernate&#xff0c;前端使用htmlajax开发环境使用eclipse&#xff0c;maven管理。 数据库使用mysql&#xff1b; 完整代码下载地址&…

3D设计软件SolidWorks特征研究—— 3种放样方式 | 附视频教程

SolidWorks 是世界上第一个基于Windows开发的三维CAD系统&#xff0c;是可实现设计、模拟、成本估算、可制造性检查、CAM、可持续设计和数据管理等多种功能的三维设计软件&#xff0c;包含适用于钣金、焊件、曲面、模具、产品配置、DFM和CAM的专业工具&#xff0c;同时支持ECAD…

跑步耳机入耳式好还是半入耳式好、跑步用的耳机推荐

运动耳机一定是要跟佩戴舒适性、音质、性能关联在一起的&#xff0c;尤其是专业的运动耳机&#xff0c;还要具有久戴舒适运动时还不掉的特点&#xff0c;这个是我认为无论任何价价位的运动耳机都必须首要具备的条件&#xff0c;戴久了不舒服或者总掉&#xff0c;音质再好估计都…

带你了解防火墙

目录 1、什么是防火墙&#xff1f; 2、iptables 3、firewalld 如何实现端口转发&#xff1f; 1、什么是防火墙&#xff1f; 防火墙&#xff1a;防火墙是位于内部网和外部网之间的屏障&#xff0c;它按照系统管理员预先定义好的规则来控制数据包的进出。防火墙又可以分为硬件…

Error: Can‘t find Python executable “python“, you can set the PYTHON env var

亲测可用&#xff0c;若有疑问请私信 此问题&#xff0c;自己分析了好久才找到问题。其实有两种解决方案&#xff0c;我这里举例了一个&#xff0c;另一种环境变量配置也是可以的。希望能帮到大家。 问题描述&#xff1a; 在执行npm install 过程中出现 V未安装 解决方案&…

Python学习笔记-PyQt6工具栏

工具栏工具栏可以有多个&#xff0c;而且可以设置不同的位置参数。4.1工具栏位置参数QtCore.Qt.ToolBarArea.LeftToolBarAreaQtCore.Qt.ToolBarArea.RightToolBarAreaQtCore.Qt.ToolBarArea.TopToolBarAreaQtCore.Qt.ToolBarArea.BottomToolBarAreaQtCore.Qt.ToolBarArea.AllTo…

库的制作相关信息

库 通过把函数进行打包&#xff0c;然后形成相应的库&#xff0c;供其他的主函数使用。 静态库 以.a进行结尾&#xff0c;把库的东西&#xff08;头与库文件进行打包到之中&#xff09;打包到可执行程序之中。 静态库不是使用相对的位置信息&#xff0c;直接的信息。 bank…

如何通过Java导出带格式的 Excel 数据到 Word 表格

在Word中制作报表时&#xff0c;我们经常需要将Excel中的数据复制粘贴到Word中&#xff0c;这样则可以直接在Word文档中查看数据而无需打开另一个Excel文件。但是如果表格比较长&#xff0c;内容就会存在一定程度的丢失&#xff0c;无法完整显示数据。并且当工作量到达一定程度…

.net6 Web Api使用JWT-从后端到前端全部过程

jwt是做验证的必经之路&#xff0c;至于原理&#xff0c;就不在叙述了&#xff0c;可以参考官网 jwt官网介绍 JSON Web Tokens - jwt.io 原理介绍 JSON Web Token 入门教程 - 阮一峰的网络日志 看完之后&#xff0c;结合这个图&#xff0c;就明白了。 本案例使用vs2022&…

从技术专家到总经理,在不确定中探索和成长

你好&#xff0c;我是石东海。 前段时间我应邀跟一些企业做过一些交流&#xff0c;探讨在这个数字化时代&#xff0c;怎么去解决技术团队所面临的一些共性问题&#xff0c;包括技术思维转变和管理思维转变方面所经历的挑战。期间谈到了一些我个人的经历&#xff0c;以及这两年…

哈希表(一)—— 闭散列 / 开放地址法的模拟实现

哈希表的基本思路是通过某种方式将某个值映射到对应的位置&#xff0c;这里的采取的方式是除留余数法&#xff0c;即将原本的值取模以后再存入到数组的对应下标&#xff0c;即便存入的值是一个字符串&#xff0c;也可以根据字符串哈希算法将字符串转换成对应的ASCII码值&#x…

这家十年磨剑的企业级存储厂商,为什么将分布式块存储也开源了?

只要提到企业级存储&#xff0c;任何成功的厂商无不以十年为单位的积累&#xff0c;才能实现真正的创新。当然&#xff0c;作为存储领域相对更为复杂的分布式块存储&#xff0c;存储创新公司一般都不太愿意碰它。原因很简单&#xff0c;在技术自研的道路上&#xff0c;更需要坐…

Nginx之限流

文章目录Nginx如何限流配置基本的限流处理突发无延迟的排队高级配置示例location包含多limit_req指令配置相关功能发送到客户端的错误代码指定location拒绝所有请求总结流量限制(rate-limiting)&#xff0c;是 Nginx 中一个非常实用&#xff0c;却经常被错误理解和错误配置的功…