08-购物车效果

news2024/9/23 9:29:35

 

先做数据,再做功能,最后界面

var goods = [
  {
    pic: './assets/g1.png',
    title: '椰云拿铁',
    desc: `1人份【年度重磅,一口吞云】

    √原创椰云topping,绵密轻盈到飞起!
    原创瑞幸椰云™工艺,使用椰浆代替常规奶盖
    打造丰盈、绵密,如云朵般细腻奶沫体验
    椰香清甜饱满,一口滑入口腔
    
    【饮用建议】请注意不要用吸管,不要搅拌哦~`,
    sellNumber: 200,
    favorRate: 95,
    price: 32,
  },]

数据中缺少商品数量,两种做法

第一种:

给数组每一项去加上一个属性,好处是不用新开内存空间了

坏处是修改了原始数据

第二种:

新创建一个uiGoods对象,将原始数据当做参数传进去

UIGoods: {
    data: goods,
    choose: 0  //选择的商品数量
}
function createUIGoods (g) {
	return {
		data: g,
		choose: 0
	};
}

let uigoods = createUIGoods(goods[0]);

console.log(uigoods);

 思考,我们现在需要创建对象,构造函数是专门用来创造对象的,所以用构造函数来做

function UIGoods (g) {
	this.data = g;
	this.choose = 0
}

let uig = new UIGoods(goods[0]);

console.log(uig);

 NumberBox数字输入框,商品选中的问题

数量大于0,就显示减号和数量

数量等于0,只显示加号

商品总价应该怎么写?作为属性传递还是函数调用?

属性传递,会造成数据冗余

作为函数传递,会增加代码复杂性

 

 是否选中

 

 封装成es6的类


/**
 *单件商品的数据
 * @class UIGoods
 */
class UIGoods{
	constructor(g) {
		this.data = g;
		this.choose = 2;
	}

	/**
	 *获取总价
	 * @return {*} 
	 * @memberof UIGoods
	 */
	getTotalPrice () {
		return this.data.price * this.choose;
	}
	
	/**
	 *是否选中此商品
	 * @return {*} 
	 * @memberof UIGoods
	 */
	isChoose () {
		return this.choose > 0;
	}
}

let uig = new UIGoods(goods[0]);
console.log(uig);

商品数量的增减用函数做,考虑库存

如果需求有变动,库存可能只有10个,一直加超过库存如何处理?

整个界面的数据

把之前封装好的单个数据拿过来,添加配送门槛和配送费

class UIData {
	constructor() {
		const uiGoods = [];
		for (let i = 0; i < goods.length; i++) {
			let uig = new UIGoods(goods[i]);
			uiGoods.push(uig);
		}
		this.uiGoods = uiGoods;
		/* 配送门槛 */
		this.deliveryThreshold = 30;
		/* 配送费 */
		this.deliveryPrice = 5;
		console.log(uiGoods);
	}
}

const ui = new UIData();

面向对象写法,计算商品总价

/**
	 * 增加某件商品的数量
	 * @param {*} index 下标
	 * @memberof UIData
	 */
	increase (index) {
		this.uiGoods[index].increase();
	}

	/**
	 * 减少某件商品的选中数量
	 * @param {*} index 下标
	 * @memberof UIData
	 */
	decrease (index) {
		this.uiGoods[index].decrease();
	}

动态创建商品列表

 两种方法

1、生成HTML字符串(parse HTML)

执行效率低,开发效率高

2、一个一个创建元素

执行效率高,开发效率低

这里用第一种

 

 

 购物车动画

 这样效率低,所以我们一开始就要监听动画,把普通函数变成箭头函数

 抛物线动画

 调用函数 ui.jump(0)  ,会从第一件商品跳到购物车

目标坐标:购物车(位置不变)

起始坐标:商品加号(位置动态变化)

getBoundingClientRect(),获得页面中某个元素的左,上,右和下分别相对浏览器视窗的位置。

购物车位置是不变的,所以不用每次调用都去计算他的坐标,一开始就可以算出来

 

 

 抛物线  transition: cubic-bezier(贝塞尔曲线)

新生成一个加号的节点,结构是 div 包裹 i 标签

div横向移动,i 在 div 里纵向移动

cubic-bezier(x1,y1,x2,y2):定义一个时间曲线(贝塞尔曲线),可以为其配置四个参数,前两个参数为“ x1 ”和“ x2 ”,定义“开始控制点”,后两个参数为“ y1 ”和“ y2 ”,定义“结束控制点”

起始位置到目标位置,中间要添加reflow样式,否则动画不会生效,两种做法

1、改变或者重新计算几何信息,比如 div.clientWidth

2、requestAnimationFrame

 

 

事件委托,添加事件

利用冒泡原理,给goods-list注册事件去影响设置goods-item

判断样式,classList.contains() 判断它的类名有没有包含某一项

index = ${ i },利用自定义属性,实现点击加号时,NumberBox数量变化

elementNode.getAttribute(name):获取节点的属性,name是属性名称,比如ID,title,value等的值。

 

 

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

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

相关文章

【SAS】【01】【scsi协议族】SCSI standards family

下图显示了SAM协议与SCSI协议族中其他协议标准和相关项目的关系。 SCSI Architecture Model: 定义SCSI系统模型、SCSI标准集的功能划分以及适用于所有SCSI实现和要求。Device-Type Specific Command Sets: 定义特定设备类型的实现标准&#xff0c;包括每种设备类型的设备模型。…

leetcode1884. 鸡蛋掉落-两枚鸡蛋.动态规划-java

鸡蛋掉落-两枚鸡蛋 leetcode1884. 鸡蛋掉落-两枚鸡蛋题目描述解题思路代码演示 动态规划代码演示 动态规划专题 leetcode1884. 鸡蛋掉落-两枚鸡蛋 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/egg-drop-with-2-eggs-a…

基于Python和Spacy的命名实体识别

命名实体识别&#xff08;Named Entity Recognition&#xff0c;简称NER&#xff09;是一种自然语言处理&#xff08;NLP&#xff09;方法&#xff0c;用于检测和分类文本中的命名实体&#xff0c;包括人物、组织、地点、日期、数量和其他可识别的现实世界实体。 Spacy是一个基…

STM32之HAL库微妙延迟(借助Systick)

代码 void bsp_us_delay(uint32_t us) {uint32_t start, now, delta, reload, us_tick;start SysTick->VAL;reload SysTick->LOAD;us_tick SystemCoreClock / 1000000UL;do {now SysTick->VAL;delta start > now ? start - now : reload start - now;} whi…

Element el-dropdown 事件

我这里是结合el-table一起使用 设置trigger"click" 就可以加点击事件 这里我需要点击下拉选择值后&#xff0c;既要得到下拉里面的值 也要得到这一行数据的值 重要的代码 <el-dropdowntrigger"click"command"handleCommand($event,scope.row,sc…

7 拓展中断_事件控制器(EXTI)

目录 EXTI-扩展中断和事件控制器 事件的概念 EXTI-扩展中断和事件控制器 EXTI外设框图 F1/F4/F7&#xff08;看懂与或门&#xff09; H7 STM32CubeMX中的EXTI配置 EXTI-扩展中断和事件控制器 事件的概念 STM32上许许多多的外设&#xff0c;是通过内部信号来协同工作的。…

VMware麒麟Kylin系统安装Linux

麒麟系统常用链接 https://www.jianshu.com/p/f58e2435b650 ios下载链接 https://eco.kylinos.cn/partners/mirror.html 其实基本上只有两个区别&#xff0c;一个是桌面操作系统和服务器操作系统的区别&#xff0c;一个是x86_64和arm内核的区别&#xff0c;我下的是这个海光版…

Splashtop 荣获2023年教育科技突破奖

2023年6月8日 加利福尼亚州库比蒂诺 Splashtop 在简化随处办公远程解决方案领域处于领先地位&#xff0c;该公司自豪地宣布其在教育科技突破奖评选活动中荣获“年度远程学习解决方案供应商奖”。这项在教育行业久负盛名的奖项特别关注创新性解决方案和创意公司&#xff0c;这些…

BlendOS 3 正在开发:承诺支持九个 Linux 发行版,无存储库更新

导读blendOS 发行版承诺混合 Arch Linux、Fedora Linux 和 Ubuntu&#xff0c;今年 4 月发布的 blendOS 2 使用 WayDroid&#xff0c;承诺运行 Android 应用程序。 开发商 Rudra Saraswat 表示&#xff0c;不可变发行版 blendOS 3 系统正在开发中&#xff0c;并承诺为不可变发行…

Nginx优化及防盗链

目录 一、隐藏版本号 1.查看版本号 2.修改配置文件 3.重启服务及查看版本号 二、修改用户 与组 1.修改配置文件 2.重启服务 三、缓存时间 1.修改配置文件 2.重启服务 3.测试访问 四、日志分割 1.写脚本 2.赋予执行权限并执行 3.验证 4.设置定时任务 五、连接超时 2…

ctfshow文件包含web87-117

1.web87 绕过死亡待可以使用rot13编码,还可以用base64编码,url两次编码&#xff0c;浏览器自动进行解码一次&#xff0c;代码解码一次&#xff0c;如果之编码一次&#xff0c;代码会被浏览器解码一次&#xff0c;这时候特殊字符还是url编码&#xff0c;而如php字符串则被还原&a…

扩增子高通量测序

扩增子测序是指利用合适的通用引物扩增环境中微生物的16S rDNA/18S rDNA /ITS高变区或功能基因&#xff0c;通过高通量测序技术检测PCR产物的序列变异和丰度信息&#xff0c;分析该环境下的微生物群落的多样性和分布规律&#xff0c;以揭示环境样品中微生物的种类、相对丰度、进…

人工智能数据集处理——数据清理2

目录 异常值的检测与处理 一、异常值的检测 1、使用3σ准则检测异常值 定义一个基于3σ准则检测的函数&#xff0c;使用该函数检测文件中的数据&#xff0c;并返回异常值 2、使用箱形图检测异常值 根据data.xlsx文件中的数据&#xff0c;使用boxplot()方法绘制一个箱型图 …

headscale专有网络及其ACL控制

如何使用 Headscale ( Tailscale 开源版 ) 快速搭建一个私有专属的 P2P 内网穿透网络 内网穿透简述 由于国内网络环境问题, 普遍家庭用户宽带都没有分配到公网 IP(我有固定公网 IP, 嘿嘿); 这时候一般我们需要从外部访问家庭网络时就需要通过一些魔法手段, 比如 VPN、远程软…

未来的编程语言「GitHub 热点速览」

作者&#xff1a;HelloGitHub-小鱼干 又一个编程语言火了&#xff0c;不算新&#xff0c;因为它已经开发了一段时间。不过在本周 Hacker News 上风头十足&#xff0c;DreamBerd 除了有点意思的改 ; 分隔符为 !&#xff0c;之外&#xff0c;它还能让你用问号来标注一段你也不确定…

通过adb获取ANR日志

1、命令行输入&#xff1a;adb bugreport 2、等待日志下载完毕&#xff0c;解压bugreport文件 3、进入FS-->data-->anr

【架构治理工具】在代码存储库中记录软件架构

Markdown 是一种标准的简单语法&#xff0c;用于创建具有专业外观的文档。它比 HTML 更简单&#xff0c;无需专门的编写编辑器即可进行管理。Git配置管理工具也支持markdown格式。在 Git 环境中&#xff0c;markdown 一般用于项目的简单介绍和构建说明。&#xff08;自述文件&a…

CSS 渐变

CSS 渐变 01 CSS 渐变基础 颜色的几种表示 渐变的几种方式 02 特殊的渐变举例 水平渐变 垂直渐变&#xff08;矩形四个点三种颜色&#xff09; 线性渐变只能在一个方向上渐变&#xff0c;要想实现这种渐变&#xff0c;可以使用两个标签进行叠加&#xff1a;一个负责水平…

npm运行没反应的问题

npm 遇到的问题 我们在经常切换node版的时候会遇到npm命令失效的问题。 我们不管运行npm的什么命令都是一闪然后就没有任何输出&#xff0c;效果如下&#xff1a; 主要原因是因为npm config set prefix 改包的路径出问题了 解决方法是&#xff1a;打开系统盘找到下列目录&am…

水力发电在可再生能源中的地位和潜力

可再生能源的发展已成为全球能源领域的重要趋势&#xff0c;而作为最古老、最成熟的可再生能源形式之一&#xff0c;水力发电在能源供应和环境保护方面发挥着重要作用。本文将深入探讨水力发电在可再生能源中的地位和潜力&#xff0c;包括其技术特点、发展趋势以及面临的挑战和…