商城小程序(8.购物车页面)

news2024/11/18 18:02:57

目录

  • 一、商品列表区域
    • 1、渲染购物车商品列表的标题区域
    • 2、渲染商品列表区域的基本结构
    • 3、为my-goods组件封装radio勾选状态
    • 4、为my-goods组件封装radio-change事件
    • 5、修改购物车中商品的选择状态
    • 6、为my-goods组件封装NumberBox
    • 7、为my-goods封装num-change事件
    • 8、修改购物车商品数量
    • 9、渲染滑动删除的UI效果
    • 10、实现滑动删除的功能
  • 二、收货地址区域
    • 1、渲染收货地址组件
    • 2、实现收货地址区域的按需展示
    • 3、实现选择收货地址的功能
    • 4、将address信息存储到vuex中
    • 5、将store中的address持久化存储到本地
    • 6、将addstr抽离为getters
    • 7、重新选择收货地址
  • 三、结算区域
    • 1、渲染结算组件
    • 2、动态渲染已勾选商品的总数量
    • 3、动态渲染全选按钮的选中状态
    • 4、实现商品的全选/反选功能
    • 5、动态渲染已勾选商品的总价格
    • 6、动态计算购物车徽标的数值
    • 7、渲染购物车为空的页面

一、商品列表区域

本章主要完成pages下的cart购物页面编写
在这里插入图片描述

1、渲染购物车商品列表的标题区域

定义如下UI结构

<template>
	<view>
		<!-- 商品列表的标题区域 -->
		<view class="cart-title">
			<!-- 左侧的图标 -->
			<uni-icons type="shop" size="18"></uni-icons>
			<!-- 右侧的文本 -->
			<text class="cart-title-text">购物车</text>
		</view>
	</view>
</template>

美化样式

<style lang="scss">
	.cart-title {
		height: 40px;
		display: flex;
		align-items: center;
		padding-left: 5px;
		border-bottom: 1px solid #EFEFEF;
		
		.cart-title-text {
			font-size: 14px;
			margin-left: 10px;
		}
	}
</style>

在这里插入图片描述

2、渲染商品列表区域的基本结构

通过 mapState 辅助函数,将Store中的cart数组映射到当前页面中使用:

在这里插入图片描述

在UI结构中,通过v-for渲染自定义组件my-goods

在这里插入图片描述

3、为my-goods组件封装radio勾选状态

打开my-goods.vue组件,为商品左侧图片区域添加radio足迹

在这里插入图片描述

并美化UI ,使radio组件和image组件左右布局
在这里插入图片描述
在这里插入图片描述
使用v-if控制radio组件的按需展示

在这里插入图片描述

修改cart.vue中的商品列表区域,给showRadio赋值true展示勾选框

在这里插入图片描述
动态绑定勾选框的选择值
在这里插入图片描述

购物车页面有勾选
在这里插入图片描述
而商品列表页面就没有了
在这里插入图片描述

4、为my-goods组件封装radio-change事件

在这里插入图片描述

在这里插入图片描述

5、修改购物车中商品的选择状态

在这里插入图片描述
导入mapMutations这个辅助函数,从而将需要的mutations方法映射到当前页面中
在这里插入图片描述

每次点击勾选状态就能随时跟新,并且重新编译,保存上次的状态实现持久化

在这里插入图片描述

6、为my-goods组件封装NumberBox

修改my-goods.vue组件的源代码,在goods-info-box的view组件内部渲染Numberbox组件的基本内容,并绑定商品数量

在这里插入图片描述

美化样式

		.goods-item-right{
			display: flex;
			flex: 1;
			flex-direction: column;
			justify-content: space-between;
			.goods-name{
				font-size: 13px;
			}
			.goods-info-box{
				display: flex;
				justify-content: space-between;
				align-items: center;
				.goods-price{
					color: #C00000;
					font-size: 16px;
				}
			}
		}

控制numberbox的按需展示
在这里插入图片描述
my-goods页面用v-if绑定是否显示 默认为false不显示
在这里插入图片描述
在cart页面将shownum值赋值true展示num框
在这里插入图片描述
商品列表页面就没有数字选择框
在这里插入图片描述
在这里插入图片描述

7、为my-goods封装num-change事件

在这里插入图片描述

最后在my-goods.vue组件的methods节点中,定义numChangeHandler事件处理函数:

在这里插入图片描述

8、修改购物车商品数量

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

在这里插入图片描述
在这里插入图片描述
现在通过numbox修改商品数量,刷新页面后同样持久化存储
在这里插入图片描述

9、渲染滑动删除的UI效果

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

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

10、实现滑动删除的功能

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

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

我们把没有图片展示的商品都删除(这是之前我自己写的一个小bug,在goods-detail页面中,加入购物车功能持久化保存商品中的goods_small_logo拼写错了,之前写的samll所以添加的商品都没图片)
在这里插入图片描述
现在展示删除功能
在这里插入图片描述
在这里插入图片描述

二、收货地址区域

右键components,新建我们的收货地址组件

在这里插入图片描述

1、渲染收货地址组件

定义基本UI结构

<template>
	<view>
		<!-- 选择收货地址的盒子 -->
		<view class="address-choose-box">
			<button type="primary" size="mini" class="btnChooseAddress">请选择收货地址</button>
		</view>
		<!-- 渲染收货信息的盒子 -->
		<view class="address-info-box">
			<view class="row1">
				<view class="row1-left">
					<view class="username">收货人: kirito</view>
				</view>
				<view class="row1-right">
					<view class="phone">电话:1586xxxxxx</view>
					<uni-icons type="arrowright" size="16"></uni-icons>
				</view>
			</view>
			<view class="row2">
				<view class="row2-left">收货地址: </view>
				<view class="row2-right">XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX</view>
			</view>
		</view>
		<!-- 底部的边框线 -->
		<image src="/static/gouwuchehenjiemian.png" class="address-border"></image>
	</view>
</template>

美化

<style lang="scss">
	.address-border {
		display: block;
		width: 100%;
		height: 5px;
	}

	.address-choose-box {
		height: 90px;
		display: flex;
		justify-content: center;
		align-items: center;
	}
	
	.address-info-box {
		font-size: 12px;
		height: 90px;
		display: flex;
		flex-direction: column;
		justify-content: center;
		padding: 0 5px;
		.row1 {
			display: flex;
			justify-content: space-between;
			
			.row1-left {
				.username {
					
				}
			}
			
			.row1-right {
				display: flex;
				justify-content: space-between;
				
				.phone {
					
				}
			}
		}
		
		.row2 {
			display: flex;
			justify-content: space-between;
			align-items: center;
			margin-top: 10px;
			
			.row2-left {
				white-space: nowrap;
			}
			.row2-right {
				
			}
		}
	}
</style>

在cart购物车页面,引用收货地址组件
在这里插入图片描述

在这里插入图片描述

2、实现收货地址区域的按需展示

在这里插入图片描述
address为空时,只展示一个选择收货地址
在这里插入图片描述

3、实现选择收货地址的功能

在这里插入图片描述
在manifest.json中赋予权限,才能调用chooseaddress的api接口
在这里插入图片描述

因为新版接口不用解构的问题,我们可以把上面的chooseAddress方法改一下
在这里插入图片描述
数据在UI结构中回显
在这里插入图片描述

页面调试:选择收货地址

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

确定之后成功展示回显数据
在这里插入图片描述

4、将address信息存储到vuex中

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

export default {
	// 开启命名空间
	namespaced: true,
	
	//数据
	state: () => ({
		address: {}
	}),
	
	//方法
	mutation: {
		// 更新收货地址
		updateAddress(state, address) {
			state.address = address
		}
	},
	
	getters: {
		
	}
}

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

在这里插入图片描述

在这里插入图片描述
选择完地址后,我们重新编译程序,也能看到地址信息。
在这里插入图片描述

5、将store中的address持久化存储到本地

修改store/user.js:

export default {
	// 开启命名空间
	namespaced: true,
	
	//数据
	state: () => ({
		address: JSON.parse(uni.getStorageSync('address') || '{}')
	}),
	
	//方法
	mutations: {
		// 更新收货地址
		updateAddress(state, address) {
			state.address = address
			this.commit('m_user/saveAddressToStorage')
		},
		// 持久化存储address
		saveAddressToStorage(state) {
			uni.setStorageSync('address', JSON.stringify(state.address))
		}
	},
	
	getters: {
		
	}
}

重新编译 一样有效果
在这里插入图片描述

6、将addstr抽离为getters

为了提高代码的复用性,可以把收货地址的详细地址抽离为getters,方便在多个页面和组件之间实现复用

在这里插入图片描述

7、重新选择收货地址

在这里插入图片描述

三、结算区域

创建结算组件

在这里插入图片描述

在cart页面调用结算组件
在这里插入图片描述

1、渲染结算组件

结算组件的UI结构:

<template>
	<view class="my-settle-container">
		<!-- 全选 -->
		<label class="radio">
			<radio color="#C00000" :checked="true" /><text>全选</text>
		</label>
		<!-- 合计 -->
		<view class="amount-box">
			合计:<text class="amount"></text>
		</view>
		<!-- 结算按钮 -->
		<view class="btn-settle">结算(0)</view>
	</view>
</template>

美化样式:

<style lang="scss">
	.my-settle-container {
		position: fixed;
		bottom: 0;
		left: 0;
		width: 100%;
		height: 50px;
		background-color: white;
		display: flex;
		justify-content: space-between;
		align-items: center;
		font-size: 14px;
		padding-left: 5px;
		
		.radio {
			display: flex;
			align-items: center;
		}
		
		.amount-box {
			.amount {
				color: #C00000;
				font-weight: bold;
			}
		}
		
		.btn-settle {
			background-color: #C00000;
			height: 50px;
			color: white;
			line-height: 50px;
			padding:0 10px;
			text-align: center;
		}
	}
</style>

在这里插入图片描述

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

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

在这里插入图片描述

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

在这里插入图片描述

为不全选时,下面全选按钮没有选中

在这里插入图片描述

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

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

点灭全选按钮,上面全部的选择都取消了,点击单个选择,下面也会选中
在这里插入图片描述

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

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

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

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

加两件商品时,徽标成功增加

在这里插入图片描述

7、渲染购物车为空的页面

在这里插入图片描述

美化页面

	.cart-container {
		padding-bottom: 50px;
	}
	.cart-title {
		height: 40px;
		display: flex;
		align-items: center;
		padding-left: 5px;
		border-bottom: 1px solid #EFEFEF;
		
		.cart-title-text {
			font-size: 14px;
			margin-left: 10px;
		}
	}
	.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;
		}
	}

删除所有商品后,页面返回
在这里插入图片描述

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

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

相关文章

Sqlmap注入参数

Sqlmap注入参数 &#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f32d;&#x1f32d;&#x1f32d;&#x1f32d;&#x1f32d;&#x1f32d;&#x1f32d;❤️❤️❤️❤️❤️❤️❤️&#x1f968;&#x1f968;&…

题目:七段码(蓝桥OJ 595)

问题描述&#xff1a; 解题思路&#xff1a; 枚举每一种可能组合&#xff08;可以使用二进制数表示&#xff0c;每一个二进制就是一种组合&#xff09;&#xff0c;在判断是否符合题目要求的每一个发光灯管相邻&#xff08;使用并查集方法确定&#xff0c;当每一个发光…

NumPy 数据操作实用指南:从基础到高效(下)

文章接上篇&#xff1a; In [53]: from PIL import Image In [60]: dog Image.open(./dog.jpg) dog . . . In [61]: dog_datanp.array(dog) # 图片数据是ndarray # 彩色照片三维&#xff1a;高度&#xff0c;宽度&#xff0c;像素&#xff08;表示不同颜色&#xff09;&…

小程序基础库与Android之间通信优化的可能

最近在学习graalvm&#xff0c;发现有一个graaljs项目&#xff0c;项目中介绍可以让java与JavaScript做数据转换&#xff0c;比如JavaScript中可以使用java的数据类型与结构。突然想到之前遇到的一个问题&#xff0c;小程序中开发的代码和基础库的部分代码都是j2v8来执行的&…

易安联参与制定的《面向云计算的零信任体系》行业标准即将实施

中华人民共和国工业和信息化部公告2023年第38号文件正式发布行业标准&#xff1a;YD/T 4598.2-2023《面向云计算的零信任体系 第2部分&#xff1a;关键能力要求》及YD/T 4598.3-2023《面向云计算的零信任体系 第3部分&#xff1a;安全访问服务边缘能力要求》&#xff0c;并于20…

如何将ArcGIS工程文件迁移到ArcGIS Pro内

当你刚接触ArcGIS Pro的时候&#xff0c;尝试新建一个工程文件会发现工程文件的后缀已经改变&#xff0c;那么以前在ArcGIS内辛苦制作的工程文件是否就不能在ArcGIS Pro内使用了&#xff0c;答案是否定的&#xff0c;对此Esri也给出了解决方案&#xff0c;这里为大家介绍一下迁…

数字化校园实验室综合管理平台|推动实验室创新发展新引擎

一、数字化建设目标 实验室数字化指的是运用新一代的人工智能、大数据、互联网技术、物联网技术、云计算技术、人体感应技术、语音技术、生物识别技术、手机APP等技术&#xff0c;实现各个业务间数据流和任务流的互通互联&#xff0c;将实验室管理过程中涉及的对象&#xff0c…

vue2 el-table行悬停时弹出提示信息el-popover

实现方法&#xff0c;用到了cell-mouse-enter、cell-mouse-leave两个事件&#xff0c;然后在表格的首列字段中&#xff0c;加个el-popover组件&#xff0c;当然你也可以选择在其他字段的位置来显示提示框&#xff0c;看自己的需求了。 示例代码&#xff1a; <el-table cell…

GLES学习笔记---立方体贴图(一张图)

一、首先看一张效果图 立方体贴图 二、纹理坐标划分 如上图是一张2D纹理&#xff0c;我们需要将这个2D纹理贴到立方体上&#xff0c;立方体有6个面&#xff0c;所以上面的2D图分成了6个面&#xff0c;共有14个纹理坐标 三、立方体 上边的立方体一共8个顶点坐标&#xff0c;范围…

Web3社交治理:用户参与决策的新模式

Web3时代的到来不仅仅带来了区块链技术的创新&#xff0c;还为社交治理带来了全新的模式。传统社交平台上的决策权通常集中在平台的运营方&#xff0c;而Web3社交治理的兴起意味着用户能够更直接地参与到社交平台的决策过程中。本文将深入探讨Web3社交治理的背景、工作原理以及…

9.云原生存储之ceph在k8s中应用及问题处理

文章目录 ceph应用场景ceph应用在k8s集群外使用块设备ceph客户端配置创建块挂载使用删除pool 在k8s集群内使用块设备创建块池和StorageClass使用存储 块存储映射问题处理问题现象事件分析csi-rbdplugin pod日志分析问题小结CentOS 7 编译安装 nbd 模块nbd内核模块介绍安装 nbd …

1.5计算机网络的分类

1.5计算机网络的分类 1.5.1按照网络的作用范围进行分类 1、广域网WAN 广域网WAN&#xff08;WideAreaNetwork&#xff09;&#xff1a;广域网的作用范围通常为几十到几千公里&#xff0c;因而有时也称为远程网(longhaulnetwork)。广域网是互联网的核心部分&#xff0c;其任务…

Linux单主机模拟测试docker macvlan网络

在单台宿主机上使用Linux Bridge&#xff0c;桥接不同网络命名空间&#xff08;namespace&#xff09;的方式&#xff0c;模拟测试docker macvlan网络&#xff0c;记录如下&#xff1a; 参考 链接: Macvlan network driver链接: Docker 网络模型之 macvlan 详解&#xff0c;图…

基于JavaWeb+BS架构+SpringBoot+Vue“共享书角”图书借还管理系统系统的设计和实现

基于JavaWebBS架构SpringBootVue“共享书角”图书借还管理系统系统的设计和实现 文末获取源码Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 文末获取源码 Lun文目录 第1章 概 述 5 1.1 开发背景及研究意义 5 1.2 国内外研究…

数字信号处理实验---LSI系统的分析 Matlab代码

1.试用Matlab计算其幅频特性和相频特性&#xff0c;并绘图。 代码&#xff1a; n 0:10; %定义采样点n w [0:1:500]*2*pi/500; % [0,pi]轴被分成1002个点 x1 power(0.9*exp(1i*pi/3),n); %定义输入序列 x2 exp(-1i*n); %定义一个系统的冲激响应 x zeros(1,length(w))…

ESP32S3+HX8347+RGB运行LVGL例程

之前用3线SPI驱动的HX8347屏其实是一个RGB屏&#xff0c;SPI只是用来给RGB屏幕的做配置的&#xff0c;当然也可以用来驱动屏幕&#xff0c;但是3线SPI驱动能力终究有限。本文谈一下用RGB方式来驱动。 RGB接线比较多&#xff0c;为此做了个转接板&#xff1a; 一、源码 1、scre…

Swoft - Bean

一、Bean 在 Swoft 中&#xff0c;一个 Bean 就是一个类的一个对象实例。 它(Bean)是通过容器来存放和管理整个生命周期的。 最直观的感受就是省去了频繁new的过程&#xff0c;节省了资源的开销。 二、Bean的使用 1、创建Bean 在【gateway/app/Http/Controller】下新建一个名为…

Kotlin-变量定义,与类型

Kotlin-变量定义 变量定义整型浮点型字符型整型之间的转换Boolean类型Null安全安全调用Elvis运算 字符串 变量定义 Kotlin可以定义的时候不标明数据的数据类型&#xff0c;编译器会根据初始值确定类型 fun main() {var b:Intvar name "crazyit.org"//声名变量的时…

ptaR7-5打探基priority_queue的使用

题目 最近乐乐开发出了一款新的游戏《打探基》&#xff0c;这款游戏需要多人配合来玩&#xff0c;至少三个游戏玩家同时出招才能使探基的血量下降一点&#xff0c;同时&#xff0c;出招的每个人战斗力下降一点&#xff0c;当战斗力小于10的时候将不能再出招&#xff0c;不知道…

系分笔记计算机网络功能、分类和部署

文章目录 1、概述2、计算机网络的功能3、计算机网络的部署结构4、计算机网络的分类4、总结 1、概述 计算机网络是系统分析师常考查的知识点&#xff0c;虽然不是专业的网络考试&#xff0c;但是网络常识是每一个考生需要掌握的。 2、计算机网络的功能 计算机网络是计算机技术与…