uni-app ——小程序购物车基本功能的实现过程

2023-11-04

文章目录


一、示例图

二、实现步骤

1.实现思路

关于实现思路在初次使用JS实现购物车时就有所讲解,其实实现思路都大致相同,理解了实现思路就很简单了,不明白的小伙伴可以翻看一下以前的相关文章。

2.静态页面的搭建

<template>
	<view>
		<!--顶部标题部分 -->
		<view class="title">
			<search-slot>
				<view class="left" slot="left"> </view>
				<view class="center" slot="center">
					<text>购物车</text>
				</view>
				<view class="right" slot="right" @click="flag = !flag">
					<text>{{ flag ? "编辑" : "取消" }}</text>
				</view>
			</search-slot>
		</view>

		<!-- 商品列表区域 -->
		<template>
			<view class="goods-Container">
				<view class="goods-list d-flex" v-for="(item, index) in list" :key="item.id">
					<!-- 选中按钮区域-->
					<label class="radio">
						<checkbox color="orange" :checked="item.checked" @click="selectItem(index)" />
					</label>
					<!-- 商品图片及描述区域 -->
					<view class="d-flex j-center a-center">
						<image :src="item.cover" mode=""></image>
						<view class="desc">
							<view class="goods-title">
								<text>{{ item.title }}</text>
							</view>
							<view class="goods-kind">
								<text>小米系列</text>
							</view>
							<view class="goods-price">
								<text>¥{{ item.pprice }}</text>
							</view>
						</view>
					</view>
					<!-- 步进器区域 -->
					<view class="number">
						<u-number-box buttonSize="50" v-model="value" @change="valChange"></u-number-box>
					</view>
				</view>
			</view>
		</template>

		<!-- 底部全选合计价格区域 -->
		<view class="footer d-flex">
			<!-- 全选按钮-->
			<view class="radio-wrapper">
				<label class="radio">
					<checkbox value="cb" @click="selectAll" color="orange" :checked="isChooseAll" />
				</label>
			</view>
			<!-- 合计价格区域 -->
			<view class="footer-outer">
				<template v-if="flag">
					<view class="footer-main d-flex">
						<view class="footer-left"> 合计 <text class="totalPrice">{{totalPrice}}</text>元</view>
						<view class="footer-right" @click="delItem"> 删除 </view>
					</view>
				</template>
				<template v-if="flag == false">
					<view class="footer-main d-flex">
						<view class="footer-left"> 移入收藏 </view>
						<view class="footer-right" @click="delItem"> 删除 </view>
					</view>
				</template>
			</view>
		</view>
	</view>
</template>

3.css样式


<style scoped>
	/* 顶部搜索栏区域样式设置 */
	.left {
		width: 44rpx;
		flex: 0 0 44px;
		align-items: center;
		text-align: center;
	}

	.center {
		flex: 1;
		height: 60rpx;
		line-height: 60rpx;
		text-align: center;
	}

	.right {
		width: 44rpx;
		flex: 0 0 44px;
		align-items: center;
		text-align: center;
		padding-right: 15rpx;
	}

	/* 商品列表区域样式设置 */
	.goods-Container {
		margin-top: 60rpx;
		padding: 0 30rpx;
		height: 800rpx;
	}

	.goods-list {
		height: 210rpx;
		line-height: 210rpx;
		margin-top: 40rpx;
	}

	.number {
		margin-top: 140rpx;
	}

	.desc {
		margin-left: 20rpx;
		width: 200rpx;
	}

	.goods-title {
		line-height: 60rpx;
	}

	.goods-kind {
		line-height: 60rpx;
	}

	.goods-price {
		line-height: 60rpx;
		color: orange;
		font-size: 37rpx;
	}

	image {
		width: 200rpx;
		height: 200rpx;
		border-radius: 15rpx;
		border: 1px solid rgb(239, 239, 239);
		padding: 10rpx;
	}

	/* 底部全选区域样式设置 */
	.footer {
		padding-left: 30rpx;
		height: 120rpx;
		line-height: 120rpx;
		margin-top: 230rpx;
	}

	.radio-wrapper {
		width: 15%;
	}

	.footer-outer {
		width: 85%;
	}

	.footer-left {
		width: 50%;
		text-align: center;
		background: orange;
		opacity: 0.7;
		font-size: 34rpx;
	}

	.footer-right {
		width: 50%;
		text-align: center;
		background: orange;
		font-size: 34rpx;
	}

	.totalPrice {
		margin: 0 10rpx;
		color: red;
		font-size: 36rpx;
	}
</style>

4.使用vuex操作相关数据

4.1 创建vuex实例,并使用模块化的方式

// 引入vue
import Vue from 'vue';
// 引入vuex
import Vuex from 'vuex';
// 引入子模块
import cart from './cart.js';

// 使用vuex插件
Vue.use(Vuex);


// 创建 store 实例
const store = new Vuex.Store({
	modules: {
		cart,
	}
})

// 暴露vuex
export default store;

4.2 store下的子模块——包括数据与相关操作方法

export default {
	//开启命名空间
	namespaced: true,

	state: {
		list: [{
				checked: false,
				id: 11,
				title: "商品标题111",
				cover: "/static/images/demo/list/1.jpg",
				// 选中商品属性
				attrs: [{
						title: "颜色",
						selected: 0,
						list: [{
								name: '火焰红',
							},
							{
								name: '炭黑',
							},
							{
								name: '冰川兰',
							}
						]
					},
					{
						title: "容量",
						selected: 0,
						list: [{
								name: '64GB',
							},
							{
								name: '128GB',
							},
						]
					},
					{
						title: "套餐",
						selected: 0,
						list: [{
								name: '标配',
							},
							{
								name: '套餐一',
							},
							{
								name: '套餐二',
							}
						]
					},
				],
				pprice: 336,
				num: 1,
				minnum: 1,
				maxnum: 10, // 该商品最大商品数,跟库存有关
			},
			{
				checked: false,
				id: 12,
				title: "商品222",
				cover: "/static/images/demo/list/1.jpg",
				// 选中商品属性
				attrs: [{
						title: "颜色",
						selected: 0,
						list: [{
								name: '火焰红',
							},
							{
								name: '炭黑',
							},
							{
								name: '冰川兰',
							}
						]
					},
					{
						title: "容量",
						selected: 0,
						list: [{
								name: '64GB',
							},
							{
								name: '128GB',
							},
						]
					},
					{
						title: "套餐",
						selected: 0,
						list: [{
								name: '标配',
							},
							{
								name: '套餐一',
							},
							{
								name: '套餐二',
							}
						]
					},
				],
				pprice: 200,
				num: 1,
				minnum: 1,
				maxnum: 10, // 该商品最大商品数,跟库存有关
			},
			{
				checked: false,
				id: 13,
				title: "商品标题333",
				cover: "/static/images/demo/list/1.jpg",
				// 选中商品属性
				attrs: [{
						title: "颜色",
						selected: 0,
						list: [{
								name: '火焰红',
							},
							{
								name: '炭黑',
							},
							{
								name: '冰川兰',
							}
						]
					},
					{
						title: "容量",
						selected: 0,
						list: [{
								name: '64GB',
							},
							{
								name: '128GB',
							},
						]
					},
					{
						title: "套餐",
						selected: 0,
						list: [{
								name: '标配',
							},
							{
								name: '套餐一',
							},
							{
								name: '套餐二',
							}
						]
					},
				],
				pprice: 100,
				num: 2,
				minnum: 1,
				maxnum: 10, // 该商品最大商品数,跟库存有关
			}
		],
		// 设置一个数组用来承载商品列表中选中的那一条记录的id
		selectId: [],
	},
	actions: {
		// 全选
		chooseAll(context) {
			context.commit('CHOOSEALL')
		},
		// 单选
		chooseItem(context, index) {
			context.commit('CHOOSEITEM', index);
		},
		// 删除
		delItem(context){
			context.commit('DELITEM');
		},
		// 增加商品数量
		changeNum(context,value){
			context.commit('CHANGENUM',value)
		}




	},
	mutations: {
		// 全选
		CHOOSEALL(state, value) {
			if (state.list) {
				state.list.forEach((item) => {
					if (item.checked) {
						item.checked = false;
					} else {
						item.checked = true;
					}
				})
			}
			
		},
		// 切换每一条数据中的单选状态
		CHOOSEITEM(state, index) {
			let id = state.list[index].id;
			let i = state.selectId.indexOf(id);
			if (state.list) {
				if (i != -1) {
					state.selectId.splice(index, 1);
					state.list[index].checked = false;	
				} else {
					state.selectId.push(id);
					state.list[index].checked = true;	
				}
			}
		},
		// 删除每一条
		DELITEM(state){
			if(state.list){
				state.list = [];
			}
		},
	},

	getters: {
		// 比较选中数组中的长度是否与原数据数组长度相等
		isChooseAll(state) {
			return state.list.length == state.selectId.length;
		},
		// 计算总价
		totalPrice(state){
			let total = 0;
			if(state.list){
				state.list.forEach((item)=>{
					if(item.checked){
						total += item.pprice * item.num;
					}
				})
				return total;
			}
		}
	}
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

uni-app ——小程序购物车基本功能的实现过程 的相关文章

  • Unity3d学习之路-简单巡逻兵

    简单巡逻兵 简单巡逻兵 游戏规则与游戏要求 游戏UML类图 游戏实现 巡逻兵部分 巡逻兵预制体 巡逻兵创建 巡逻兵巡逻与追捕 玩家部分 区域部分 订阅与发布模式部分 发布事件类 订阅者 水晶触碰 玩家
  • 2021年 至 2023年 mysql国家法定节假日脚本

    2021年 至 2023年 mysql国家法定节假日脚本 查阅相关资料 根据日历表核对数据 获取2021 2022 2023年数据 建表语句 DROP TABLE IF EXISTS public holiday info CREATE T
  • java代码实现导出或者下载xml、word、pdf、excel功能

    java代码实现导出或者下载xml word pdf excel功能 写在前面 将用户操作日志以xml word pdf excel格式的文件导出 1 导出xml 导出xml使用JAXB的注解实现 实体如下 import javax xml
  • 目标检测——mAP

    mean Average Precision 对于一张图片中的c类目标 算法检测出来 T 个c类的目标 而真值是 TP FN 个c类的目标 检测结果中有 TP 个结果和真值的 IOU 达到某个设定的阈值 那么Precision定义为 对所有

随机推荐

  • 机器学习—使用Gradient Descent预测房价—c++实现

    1 Introduction 之前写了一篇梯度下降的c语言实现 听吴恩达机器学习的入门课 于是考虑自己写一个简易的机器学习的例子 我们打算做一个model为f x W x B这样简单的模型 背景可以理解为房子的面积对应不同的价格 x为房子的
  • BUG:使用/var/log/messages初步定位软件莫名退出问题

    BUG 使用 var log messages定位问题 1 var log 目录下文件和目录简介 var log messages 包括整体系统信息 也包含系统启动期间的日志 此外 mail cron daemon kern和auth等内容
  • 使用谷歌提供的解析插件gsonformat安装到Android studio方法

    转载地址 https www cnblogs com tianmanyi p 6028624 html Android Studio菜单栏File gt Settings gt plugins 这个是Android Studio搜索和安装插
  • C语言——输入两个数,输出较大值(函数调用实现)

    C语言函数调用 输入两个数 要求输出其较大值 一个返回值 两个参数 名字getMaxFromTwoData 函数体 正常实现 三目运算符 函数调用过程 1 在定义函数中指定的形参 在未出现函数调用时 不占用存储单元 发生调用时 函数形参被临
  • 解决Tomcat下IntelliJ IDEA报错java.lang.NoClassDefFoundError: javax/servlet/ServletContextListener

    解决Tomcat下IntelliJ IDEA报错java lang NoClassDefFoundError javax servlet ServletContextListener 笔者在做代码重构的时候 以前记得运行正常的代码 如今一直
  • 解决Pycharm导入模块时提示Cannot find reference

    问题描述 今天在学习python时候遇到了一个导入模块时提醒Cannot find reference 的问题 要导入的这个模块是正常的 解决方案 在pycharm中设置source路径 File gt Setting gt Project
  • 数据结构与算法Python版期末在线考试OJ部分

    1 二叉树路径 10分 题目内容 给定一个二叉查找树的节点插入顺序 请重新构建这个二叉查找树 并按从左至右顺序返回所有根节点至叶节点的路径 输入格式 一行整数 以空格分隔 注 测试用例中不包含重复的数字 输出格式 按照叶节点由左至右顺序 以
  • 【亲测可用】使用pm2部署nuxt项目

    1 科普 Nuxt是一个基于vue js的应用框架 可以做到服务器端渲染 解决vue动态生成页面 难以SEO优化的难题 详情我这里不赘述了 想要了解的可以查看这里 Nuxt教程 PM2是一个进程管理工具 用于启动 维护Node的应用程序 非
  • Finalshell连接Linux超时之Connection timed out: connect

    BUG原因 每次重启finalshell 还是 CentOS ip地址存在变化的可能 目录 前言 报错 摸索 解决措施 前言 1 福利 花了2小时才解决的BUG 希望本篇文章能帮你10分钟解决 2 tips ipconfig或ip addr
  • cp can‘t stat ..........

    在我把usr src linux source 5 13 0 tar bz2复制的时候出现了错误 就是这个提示 cp cannot stat linux source 5 13 0 tar bz2 No such file or direc
  • Linux性能调优之sar详解

    什么是sar sar是一个采集 报告和存储计算机负载信息的工具 有的时候 我们要通过对系统的cpu负载等性能数值的查看 来判排查系统产生某种故障 经常死机或者运行速度突然变慢 的原因 但是 简单的top uptime w等命令只可以查看当前
  • linux :ubuntu 安装搜狗输入法

    1 安装Fcitx输入框架 sudo apt install fcitx 2 搜狗输入法官网下载Linux版本搜狗输入法 32位和64位根据自己情况 3 输入指令安装 sudo dpkg i sogoupinyin 2 3 1 0112 a
  • 虚拟机的内存泄漏和内存溢出

    文章目录 内存泄漏 内存溢出 集合引起的内存泄漏 内存泄漏 内存泄漏的根本原因是长生命周期的对象持有短生命周期对象的引用 尽管短生命周期的对象已经不再需要 但由于长生命周期对象持有它的引用而导致不能被回收 以发生的方式来分类 内存泄漏可以分
  • google protobuf使用

    http www cnblogs com youxin p 4073703 html If you get the source from github you need to generate the configure script f
  • chatgpt赋能python:如何实现Python代码执行完后再执行

    如何实现Python代码执行完后再执行 当我们在编写Python代码时 可能会需要在代码执行完之后再执行一些任务 这种情况非常常见 例如在爬虫中 可能需要在爬取完网页内容后再将其存入数据库 Python提供了多种方法来实现这个目的 方法一
  • 嵌入式开发之堆栈调试打印

    简介 打印堆栈的常用方法包括 glibc中的backtrace函数 gcc内置函数 builtin return address 第三方库libunwind 1 glibc中的backtrace 1 1函数原型 include
  • 如何设置ppt,使讲演者看到备注,而观众看不到(很好,很实用!)

    前言 大家在看此篇文章之前心中是不是一直存有一个疑问 那就是office组件中的powerpoint PPT 制作中的 备注 到底有何作用 在工作中经常用PPT放映演示给客户进行讲演 也见识过专业讲师和IT销售给我介绍产品 使用的也是 PP
  • AD查询1000条限制和解决方案

    http www riaos com ria 11639 公司的一个项目要从AD上取数据 为了测试性能 批量在AD上创建了2000多个用户 但是用java程序获取所有用户的时候会报错或者只能取到1000条数据 用com novell lda
  • Hash函数

    Hash函数 1 数据完整性 2 Hash函数 1 Hash函数定义 2 Hash函数的应用 3 Hash函数的基本要求 4 Hash函数的安全性 5 随机预言机ROM 6 ROM中的三个算法 1 原像问题 2 第二原像问题 3 碰撞问题
  • uni-app ——小程序购物车基本功能的实现过程

    文章目录 前言 一 示例图 二 实现步骤 1 实现思路 2 静态页面的搭建 3 css样式 4 使用vuex操作相关数据 总结 一 示例图 二 实现步骤 1 实现思路 关于实现思路在初次使用JS实现购物车时就有所讲解 其实实现思路都大致相同