当前位置: 首页 > news >正文

关于HarmonyOS的学习

day31

购物车案例

一、加入购物车

        1、点击按钮后,把当前这个列表的数据拿到,应该存储到一个数组里面 --- 数据结构,把数据存储进行数组2、假如已经把所有的数据添加数组完毕,最终应该存储进购物车里面,所谓的购物车说白了最终还是得从localStorage里面获取数据 --- 两个页面数据共享(localStorage)3、当点击后按钮,怎么把当前这个列表的数据拿到呢?=> find() 通过这个查找数据=> 可以把数据的id绑定给按钮标记(通过自定义属性)=> H5新增了一种自定义属性的方式4、加入购物车的数据,应该先从购物车里面获取,应该在已经有的数据的基础上进行操作5、判断下这个数组是否为空,如果为空就添加。如果不为空,就要查看是否有重复的数据

利用面向对象来写js

    class List {constructor(){this.ul = document.querySelector('ul')this.span = document.querySelector('span')
​// 需要操作的数据this.data = product_listthis.init()this.totalCount()}init(){this.render()this.bindEvent()}render(){this.data.forEach(item=>{this.ul.innerHTML += `<li><div class="pic"><img src="${item.url}"></div><p class="title">${item.title}</p><p class="des">${item.des}</p><p class="price">${item.price}</p><button data-id=${item.id}>加入购物车</button></li>`})}// 由于按钮需要绑定很多次事件,最简单的可以使用事件委派bindEvent(){this.ul.addEventListener('click', (e)=>{// 获取事件目标对象  nodeType  nodeValue  nodeNamelet t = e.targetif(t.nodeName === 'BUTTON'){// 获取当前按钮的自定义属性let id = t.dataset.id - 0// 使用find方法拿到当前的数据let goods = this.data.find(item=> item.id === id)// 声明一个数组用来存储当前的列表数据 --- 人为规定:存储进行localStorage里面的数据名称,叫做cart// 加入购物车的数据,应该先从购物车里面获取,应该在已经有的数据的基础上进行操作// 注意点:从localStorage里面如果没有拿到数据外界返回的是null,null使用JSON.parse()不会报错,返回的还是null// 没有就返回一个空的数组,把数据添加行这个数组let list = JSON.parse(localStorage.getItem('cart')) || []// 判断数组是否为空if(!list.length){goods.cart_num = 1list.push(goods)}else{// 进到这里说明已经有数据了,那么应该判断下这个数组里面是否有相同的数据// some() --- 查看数组是否有满足条件的,如果有就直接返回truelet res = list.some(item=>item.id === id)// 如果有重复的,应该把这个数据从数组里面获取出来,把数据的cart_num数量自增if(res){let index = list.findIndex(item=>item.id === id)list[index].cart_num++}else{// 说明没有重复的,把数据添加进行数组goods.cart_num = 1list.push(goods)}}// 应该把数据存储进行localStorage里面localStorage.setItem('cart', JSON.stringify(list))// 每次重复存储的时候,让其再次调用计算this.totalCount()}})}totalCount(){let list = JSON.parse(localStorage.getItem('cart')) || []let num = 0list.forEach(item=> num += item.cart_num)this.span.innerHTML = num}
​}new List()

二、购物车界面:

也是利用面向对象来完成js部分

    class Cart {constructor(){// 从localStorage里面获取到购物车里面的数据this.list = JSON.parse(localStorage.getItem('cart')) || []// 声明变量作为价格的处理this.price = 0// 获取元素this.tbody = document.querySelector('tbody')this.footer = document.querySelector('.footer')this.cartTable = document.querySelector('.cartTable')this.init()}init(){this.render()this.bindEvent()}render(){let totalNum = 0let totalPrice = 0// 如果没有数据,那么就给用户一个提示,让其跳转到加入购物车的页面if(!this.list.length){this.tbody.innerHTML = `<tr height="100"><td colspan="6"><h1>您的购物车空空如也!赶紧去购物<a href="./02_加入购物车.html">Go...</a></h1>    </td></tr>`}else{// 如果重复调用render函数的话,那么就应该把之前的数据清除,根据新的数据重新添加this.tbody.innerHTML = ''// 如果有数据,那么就根据购物车里面的数据进行列表渲染this.list.forEach(item=>{// item.is_select表示复选框是否选中的状态this.tbody.innerHTML += `<tr><td><input type="checkbox" value="" class="select" ${item.is_select && "checked"} data-id=${item.id}></td><td><img src="${item.url}" ><span style="font-size:14px;">${item.title}</span></td><td><span>${item.price}</span></td><td><button class="sub" data-id=${item.id}>-</button><input type="text" value="${item.cart_num}" class="count"><button class="add" data-id=${item.id}>+</button></td><td><span class="price">${item.cart_num * item.price}元</span></td><td><span class="del" data-id=${item.id}>删除</span></td></tr>`// 计算商品的种类的件数// if(item.is_select){//     totalNum++// }
​// 计算商品总的件数if(item.is_select){totalNum += item.cart_numtotalPrice += item.cart_num * item.price}})}// 决定全选复选框的状态let _state = this.list.every(item=> item.is_select)// 判断下数组是否为空if(!this.list.length){_state = false}// 全选复选框的状态是由单选的复选框来决定的this.footer.innerHTML = `<div class="left"><input type="checkbox" value="" class="allCheck" ${_state && "checked"}/><span class="dlAll">删除</span></div><div class="rirght"><div class="allNum">已选商品<b class="totalNum">${totalNum}</b>件</div><div class="allCount">合计 ¥<b class="money">${totalPrice.toFixed(2)}</b>元</div><div class="calc">结算</div></div>`// 数据持久化localStorage.setItem('cart', JSON.stringify(this.list))this.price = totalPrice.toFixed(2)}// 开发思想数据驱动视图:当数据改变了,那么界面就跟着改变(重新渲染),你只需要操作数据即可。这种思想目前在vue、react里面是非常常见的bindEvent(){this.cartTable.addEventListener('click', e=>{let t = e.targetif(t.className === 'allCheck'){// 获取全选复选框的状态let state = t.checkedthis.list.forEach(item=>{item.is_select = state})// 当数据改变了,根据改变后的数据重新渲染一次页面即可this.render()}if(t.className === 'select'){// 当点击单选复选框的时候,应该先把当前这条数据拿到,再把这个数据的选中状态给改变// 拿到单选框的自定义idlet id = t.dataset.id - 0let goods = this.list.find(item=>item.id === id)goods.is_select = !goods.is_selectthis.render()}if(t.className === 'add'){let id = t.dataset.id - 0let goods = this.list.find(item=>item.id === id)// 注意点:最多可以购买多少件商品,这里需要判断是是否已经达到库存的数量,而不是固定数量写法if(goods.cart_num >= 10){alert('限购10件')return}goods.cart_num++this.render()}if(t.className === 'sub'){let id = t.dataset.id - 0let goods = this.list.find(item=>item.id === id)if(goods.cart_num === 1){return }goods.cart_num--this.render()}// 单个删除if(t.className === 'del'){let id = t.dataset.id - 0let index = this.list.findIndex(item=>item.id === id)// splice shift pop  this.list.splice(index, 1)this.render()}// 全选删除if(t.className === 'dlAll'){let newList = this.list.filter(item=> item.is_select === false)this.list = newListthis.render()}if(t.className === 'calc'){// sessionStorage.setItem('price', this.price)location.href = `./04_结算页面.html?${this.price}`}})}}new Cart()

三、结算页面

<h1>结算页面</h1>
<script>console.log(location.search.slice(1))
</script>

相关文章:

关于HarmonyOS的学习

day31 购物车案例 一、加入购物车 1、点击按钮后&#xff0c;把当前这个列表的数据拿到&#xff0c;应该存储到一个数组里面 --- 数据结构&#xff0c;把数据存储进行数组2、假如已经把所有的数据添加数组完毕&#xff0c;最终应该存储进购物车里面&#xff0c;所谓的购物车说…...

【雅特力AT32】搭建模板工程及GPIO点灯操作

目录 AT32模板工程建立及点灯操作 建立AT32模板工程 AT32点灯操作 LED原理图GPIO寄存器LED源码分析 建立AT32模板工程 从0到编译运行详细搭建保姆教程&#xff1a; 【雅特力AT32】Keil 环境&#xff1a;搭建标准库模板工程、使用 AT-Link、Debug 里选择 CMSIS-DAP调试器 下面做…...

实战千问2大模型第三天——Qwen2-VL-7B(多模态)视频检测和批处理代码测试

画面描述:这个视频中,一位穿着蓝色西装的女性站在室内,背景中可以看到一些装饰品和植物。她双手交叉放在身前,面带微笑,似乎在进行一场演讲或主持活动。她的服装整洁,显得非常专业和自信。 一、简介 阿里通义千问开源新一代视觉语言模型Qwen2-VL。其中,Qwen2-VL-72B在大…...

数据库索引底层数据结构之B+树MySQL中的页索引分类【纯理论干货,面试必备】

目录 1、索引简介 1.1 什么是索引 1.2 使用索引的原因 2、索引中数据结构的设计 —— B树 2.1 哈希 2.2 二叉搜索树 2.3 B树 2.4 最终选择之——B树 2.4.1 B树与B树的对比(面向索引)【面试题】 3、MySQL中的页 3.1 页的使用原因 3.2 页的结构 3.2.1 页文件头和页文件…...

编译QT源码时的configure参数须知

文章目录 一、configure help原文二、configure help机译三、features 执行命令得到configure帮助文件 qtsrc/configure --help一、configure help原文 Usage: configure [options] [-- cmake-options]This is a convenience script for configuring Qt with CMake. Options…...

如何利用人工智能大模型来进行数字化营销?

这是一本关于如何利用人工智能大模型来进行数字化营销并驱动业绩增长的书。人工智能大模型是指那些具有超大规模的参数和数据的人工智能模型&#xff0c;它们能够在各种复杂的任务上表现出惊人的能力。 在本书中&#xff0c;你将学习到如何在电商、广告和用户增长等数字化营销业…...

【MRI基础】回波序列长度-echo train length ETL概念

回波序列长度 回波序列长度 (echo train length, ETL) 是磁共振成像 (MRI) 中的一个重要参数&#xff0c;它对图像采集时间和图像质量有显著影响。ETL 是指在单个激励脉冲之后的 MRI 序列中采集的回波数量。通过增加 ETL&#xff0c;可以在一个重复时间 (TR) 内收集多个回波&a…...

(179)时序收敛--->(29)时序收敛二九

1 目录 (a)FPGA简介 (b)Verilog简介 (c)时钟简介 (d)时序收敛二九 (e)结束 1 FPGA简介 (a)FPGA(Field Programmable Gate Array)是在PAL (可编程阵列逻辑)、GAL(通用阵列逻辑)等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域…...

[Visual Stuidio 2022使用技巧]2.配置及常用快捷键

使用vs2022开发WPF桌面程序时常用配置及快捷键。 语言&#xff1a;C# IDE&#xff1a;Microsoft Visual Studio Community 2022 框架&#xff1a;WPF&#xff0c;.net 8.0 一、配置 1.1 内联提示 未开启时&#xff1a; 开启后&#xff1a; 开启方法&#xff1a; 工具-选…...

每日奇难怪题(持续更新)

1.以下程序输出结果是() int main() {int a 1, b 2, c 2, t;while (a < b < c) {t a;a b;b t;c--;}printf("%d %d %d", a, b, c); } 解析:a1 b2 c2 a<b 成立 ,等于一个真值1 1<2 执行循环体 t被赋值为1 a被赋值2 b赋值1 c-- c变成1 a<b 不成立…...

江协科技STM32学习- P13 TIM定时器中断

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…...

git github仓库管理

原文链接&#xff1a;git github仓库管理 拉取镜像 github的仓库有两种下载方式,http和ssh,http是对外公开的,可以直接clone,ssh的一般是自己的或内部的仓库,仓库需要配置ssh-key才能使用git clone. 或者直接网页下载 #https git clone https://github.com/git/git.git #ssh…...

【JavaEE】线程安全性问题,线程不安全是怎么产生的,该如何应对

产生线程不安全的原因 在Java多线程编程中&#xff0c;线程不安全通常是由于多个线程同时访问共享资源而引发的竞争条件。以下是一些导致线程不安全的常见原因&#xff1a; 共享可变状态&#xff1a;当多个线程对共享的可变数据进行读写时&#xff0c;如果没有适当的同步机制&…...

低代码-赋能新能源汽车产业加速前行

在“双碳”战略目标的引领下&#xff0c;全球新能源汽车产业正经历着前所未有的发展和变革&#xff0c;新能源汽车整车制造成为绿色低碳转型的重要领域。在政府的大力扶持下&#xff0c;新能源整车制造领域蓬勃发展&#xff0c;已成为全球汽车产业不可逆转的重要趋势。新能源汽…...

基于UDP的简易网络通信程序

目录 0.前言 1.前置知识 网络通信的大致流程 IP地址 端口号&#xff08;port&#xff09; 客户端如何得知服务器端的IP地址和端口号&#xff1f; 服务器端如何得知客户端的IP地址和端口号&#xff1f; 2.实现代码 代码模块的设计 服务器端代码 成员说明 成员实现 U…...

AI大模型在知识管理平台上的应用:泛微·采知连实现自动采集.精准搜索.智能问答.主动推荐

AI技术的发展&#xff0c;正在推动组织知识管理模式发生变革。知识管理系统通过各种应用实现知识体系落地&#xff0c;当前聚焦于整合生成式AI技术&#xff0c;以提升业务效率。 组织在数字化进程中面临着知识增量增多、知识更新频率变快、知识与业务结合更紧密等挑战&#xff…...

JavaEE:文件内容操作(一)

文章目录 文件内容的读写---数据流字节流和字符流打开和关闭文件文件资源泄漏try with resources 文件内容的读写—数据流 文件内容的操作,读文件和写文件,都是操作系统本身提供了API,在Java中也进行了封装. Java中封装了操作文件的这些类,我们给它们起了个名字,叫做"文…...

无人机视角下落水救援检测数据集

无人机视角下落水救援检测数据集&#xff0c;利用无人机快速搜索落水者对增加受害者的生存机会至关重要&#xff0c;该数据集共收集12万帧视频图像&#xff0c;涵盖无人机高度从10m-60m高度&#xff0c;检测包括落水者&#xff08;11万标注量&#xff09;、流木&#xff08;900…...

openssl+keepalived安装部署

文章目录 OpenSSL安装下载地址编译安装修改系统配置版本 Keepalived安装下载地址安装遇到问题安装完成配置文件 keepalived运行检查运行状态查看系统日志修改服务service重新加载systemd检查配置文件语法错误 OpenSSL安装 下载地址 ​ 考虑到后面设备可能没法连接到外网&…...

float存储原理

float存储原理基于IEEE 754标准&#xff0c;主要包括符号位、指数位和有效数字位三部分。以下是对其存储原理的具体介绍&#xff1a; 符号位&#xff1a;符号位是浮点数中用于表示正负的位。在单精度浮点数&#xff08;32位&#xff09;中&#xff0c;最左边的第1位是符号位&a…...

测试驱动开发与持续集成实践指南

测试驱动开发与持续集成实践指南 引言 测试驱动开发&#xff08;TDD&#xff09;和持续集成&#xff08;CI&#xff09;是现代软件开发中的重要实践。TDD强调先写测试再实现功能&#xff0c;CI确保代码的持续质量和快速反馈。本文将深入探讨TDD的方法论和CI的实践经验。 一、测…...

嵌入式核心板小型化设计:从邮票孔到板对板连接器的技术演进与应用

1. 项目概述&#xff1a;当“小”成为一种刚需在嵌入式硬件开发领域&#xff0c;我们常常面临一个经典的权衡&#xff1a;性能、成本与体积。过去&#xff0c;为了追求极致的稳定性和丰富的接口&#xff0c;核心板往往做得比较大&#xff0c;通过邮票孔或高密度连接器与底板固定…...

书成紫微动,律定凤凰驯:海棠山铁哥的道,从来不是嘴上说的,是写在作品里的

文坛从不缺大道理&#xff0c;也不缺高谈阔论的传道者&#xff0c;历来最缺的&#xff0c;是知行合一、落地成真的真大道。一、乱象&#xff1a;言道者多&#xff0c;行道者少口头标榜实际行径文脉传承随波逐流初心坚守妥协功利拒绝流量收割热度敬畏真诚唯数据论 语言可以伪装人…...

别再拍脑袋定样本量了!用Excel 5分钟搞定市场调研的样本容量计算(附置信区间模板)

别再拍脑袋定样本量了&#xff01;用Excel 5分钟搞定市场调研的样本容量计算&#xff08;附置信区间模板&#xff09; 在快节奏的商业决策中&#xff0c;市场调研的可靠性往往取决于一个关键数字——样本量。产品经理小张最近就踩了坑&#xff1a;耗时两周完成的500份用户问卷&…...

UE5 3D Widget 渲染优化:告别动态模糊与重影困扰

1. 3D Widget动态模糊问题的根源剖析 第一次在UE5项目中使用3D Widget展示动态角色动画时&#xff0c;我被那些飘忽不定的睫毛重影彻底搞懵了。明明在静态预览时一切正常&#xff0c;但只要角色开始眨眼或做表情&#xff0c;睫毛和发丝边缘就会出现诡异的拖影效果&#xff0c;就…...

企业无线准入实战:AC联动RADIUS与内置Portal构建安全访客网络

1. 为什么企业需要安全访客网络&#xff1f; 想象一下这样的场景&#xff1a;你的公司经常有合作伙伴、客户来访&#xff0c;他们需要临时使用Wi-Fi。如果直接开放内部网络&#xff0c;就像把家门钥匙随便发给陌生人&#xff1b;如果用简单密码共享&#xff0c;又像在公共场合大…...

终极ModEngine2指南:从零开始掌握魂类游戏模组引擎

终极ModEngine2指南&#xff1a;从零开始掌握魂类游戏模组引擎 【免费下载链接】ModEngine2 Runtime injection library for modding Souls games. WIP 项目地址: https://gitcode.com/gh_mirrors/mo/ModEngine2 想要为《黑暗之魂3》或《艾尔登法环》添加自定义内容却苦…...

从‘尺子刻度’到‘信号保真’:用Python仿真带你直观理解ADC的INL、DNL和SNDR到底在说什么

从‘尺子刻度’到‘信号保真’&#xff1a;用Python仿真带你直观理解ADC的INL、DNL和SNDR到底在说什么 在数字信号处理的世界里&#xff0c;模数转换器(ADC)扮演着将连续模拟信号转换为离散数字信号的关键角色。但对于许多软件开发者或跨领域学习者来说&#xff0c;ADC的性能参…...

从warmup_csaw_2016看栈溢出利用的本质:绕过NX/ASLR?不,这次我们先学‘计算’

从warmup_csaw_2016看栈溢出利用的本质&#xff1a;计算的艺术 在二进制安全领域&#xff0c;栈溢出常被初学者视为"魔法攻击"——只需覆盖返回地址就能获得控制权。但当我们剥开NX/ASLR等现代保护机制的外衣&#xff0c;会发现精确计算才是漏洞利用的永恒核心。2016…...

Cursor Free VIP:终极免费解锁AI编程助手Pro功能的完整指南

Cursor Free VIP&#xff1a;终极免费解锁AI编程助手Pro功能的完整指南 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro 功能: Youve reached you…...