vue3项目-小兔鲜儿笔记-购物车02

news/2024/5/6 23:45:10/文章来源:https://www.cnblogs.com/jzhFlash/p/16671244.html

1.购物车页面-列表展示-本地

  • 准备已选择的商品列表数据,已选择的商品件数以及需要支付的金额

  • 渲染模板

// 有效商品列表
validList(state) {return state.list.filter((goods) => goods.isEffective && goods.stock > 0)
},
// 有效商品件数
validTotal() {return this.validList.reduce((p, c) => {return p + c.count}, 0)
},
// 有效商品总金额
validAmount() {return this.validList.reduce((p, c) => {return p + Number((c.nowPrice * c.count).toFixed(2))}, 0)
},
// 选中商品列表
selectedList() {return this.validList.filter((goods) => goods.selected)
},
// 选中商品件数
selectedTotal() {return this.selectedList.reduce((p, c) => {return p + c.count}, 0)
},
// 选中商品总金额
selectedAmount() {return this.selectedList.reduce((p, c) => {return p + Number((c.nowPrice * c.count).toFixed(2))}, 0)
},
// 是否全选
isCheckAll() {return (this.validList.length === this.selectedList.length &&this.selectedList.length !== 0)
}
          <!--     有效商品     --><tbody><tr v-if="cartStore.validList.length === 0"><!-- 合并6列的宽度 --><td colspan="6"><cart-none /></td></tr><tr v-for="goods in cartStore.validList" :key="goods.skuId"><td><!--      通过$event拿到change事件返回的默认参数       --><xtx-checkbox@change="checkOne(goods.skuId, $event)":modelValue="goods.selected"/></td><td><div class="goods"><router-link to="/"><img v-lazy="goods.picture" alt="" /></router-link><div><p class="name ellipsis">{{ goods.name }}</p><!-- 选择规格组件 --><CartSku:attrsText="goods.attrsText":skuId="goods.skuId"@change="($event) => updateCartSku(goods.skuId, $event)"/></div></div></td><td class="tc"><p>&yen;{{ goods.nowPrice }}</p><p>比加入时降价<span class="red">&yen;{{ goods.nowPrice - goods.price }}</span></p></td><td class="tc"><xtx-numberbox:max="goods.stock"@change="($event) => changeCount(goods.skuId, $event)":modelValue="goods.count"/></td><td class="tc"><p class="f16 red">&yen;{{ Number((goods.nowPrice * goods.count).toFixed(2)) }}</p></td><td class="tc"><p><a href="javascript:;">移入收藏夹</a></p><p><a@click="deleteCart(goods.skuId)"href="javascript:;"class="green">删除</a></p><p><a href="javascript:;">找相似</a></p></td></tr></tbody></table></div><!--   操作栏   --><div class="action"><div class="batch"><xtx-checkbox @change="checkAll" :modelValue="cartStore.isCheckAll">全选</xtx-checkbox><ul><li><a @click="batchDeleteCart" href="javascript:;">删除所选商品</a></li><li><a href="javascript:;">移入收藏夹</a></li></ul></div><div class="wrapped"><span class="totalCount">共 {{ cartStore.validTotal }} 件商品,</span><span class="validCount">已选择 {{ cartStore.selectedTotal }} 件,</span><span class="validAmount">商品合计:<span class="red">&yen;{{ cartStore.selectedAmount }}</span></span><a @click="checkout" href="javascript:;" class="btn">下单结算</a></div></div>

 

2. 购物车页面-单选操作-本地

  • 定义修改购物车商品选中状态的actions

// 更新购物车中的商品信息updateGoods(newGoods) {// newGoods中有些字段可能不完整,要先判断// newGoods中必须要有skuId,这样才能找到对应商品const oldGoods = this.list.find((goods) => goods.skuId === newGoods.skuId)for (const key in newGoods) {if (newGoods[key] !== null &&newGoods[key] !== '' &&newGoods[key] !== undefined) {oldGoods[key] = newGoods[key]}}},// 修改购物车的状态(选中,数量)asyncUpdateGoods(newGoods) {// 必须有skuId,可能有:selected 和 countreturn new Promise((resolve, reject) => {const userStore = useUserStore()if (userStore.profile.token) {// 已登录} else {// 未登录this.updateGoods(newGoods)resolve()}})},
  • 在购物车页面单选的复选框处理change事件从而处理选中状态

                <!--      通过$event拿到change事件返回的默认参数       --><xtx-checkbox@change="checkOne(goods.skuId, $event)":modelValue="goods.selected"/>
// 单选商品
const checkOne = (skuId, selected) => {cartStore.asyncUpdateGoods({ skuId, selected })
}

 

3. 购物车页面-全选操作-本地

  • 定义actions

    // 做有效商品的全选/反选checkAllCart(selected) {return new Promise((resolve, reject) => {const userStore = useUserStore()if (userStore.profile.token) {// 已登录} else {// 未登录const validList = this.list.filter((goods) => goods.isEffective && goods.stock > 0)// 根据传来的selected状态进行全选/反选validList.forEach((goods) => {this.updateGoods({ skuId: goods.skuId, selected })})}})},
  • 在购物车页面调用全选

                <xtx-checkbox@change="checkAll":modelValue="cartStore.isCheckAll">
// 全选与反选商品
const checkAll = (selected) => {cartStore.checkAllCart(selected)
}

 

4. 购物车页面-删除操作-本地

  • 定义actions

    // 删除购物车中的商品deleteCart(skuId) {const index = this.list.findIndex((goods) => goods.skuId === skuId)this.list.splice(index, 1)},//结合登录逻辑和未登录逻辑的删除购物车中的商品asyncDeleteCart(skuId) {return new Promise((resolve, reject) => {const userStore = useUserStore()if (userStore.profile.token) {// 已登录} else {// 未登录this.deleteCart(skuId)resolve()}})}
  • 在购物车页面调用删除

// 删除商品
const deleteCart = (skuId) => {Confirm({ title: '温馨提示', text: '您确认从购物车中删除该商品吗?' }).then(() => {cartStore.asyncDeleteCart(skuId).then(() => {Message({ type: 'success', text: '成功删除商品' })})}).catch((e) => {console.log(e)})
}

 

5. 封装确认框组件

  • 实现组件基础结构

<template><div class="xtx-confirm" :class="{ fade: fade }"><div class="wrapper" :class="{ fade: fade }"><div class="header"><h3>{{ title }}</h3><a@click="cancel"href="javascript:;"class="iconfont icon-close-new"></a></div><div class="body"><i class="iconfont icon-warning"></i><span>{{ text }}</span></div><div class="footer"><xtx-button @click="cancel" size="mini" type="gray">取消</xtx-button><xtx-button @click="submit" size="mini" type="primary">确认</xtx-button></div></div></div>
</template>
const props = defineProps({title: {type: String,default: '温馨提示'},text: {type: String,default: ''},cancelCallback: {type: Function},submitCallback: {type: Function}
})

逻辑分析:

Confirm.jsimport { createVNode, render } from 'vue'
import XtxConfirm from './xtx-confirm.vue'
// 1.导入被创建的组件
// 2.使用createVNode创建组件的虚拟DOM
// 3.准备一个DOM容器装载组件节点
// 4.使用render函数渲染组件的虚拟节点为真实的DOM节点,并挂载到DOM容器上
const div = document.createElement('div')
div.classList.add('xtx-confirm-container')
document.body.appendChild(div)export default function ({ title, text }) {// 返回一个promise对象,点取消和确认都要销毁组件return new Promise((resolve, reject) => {// 点击取消,触发reject并销毁组件const cancelCallback = () => {render(null, div) // 销毁组件reject(new Error('取消'))}// 点击确认,触发resolve并销毁组件const submitCallback = () => {render(null, div)resolve()}const vnode = createVNode(XtxConfirm, { title, text, cancelCallback, submitCallback })render(vnode, div)})
}

在调用删除商品时使用确认框:

// 删除商品
const deleteCart = (skuId) => {Confirm({ title: '温馨提示', text: '您确认从购物车中删除该商品吗?' }).then(() => {cartStore.asyncDeleteCart(skuId).then(() => {Message({ type: 'success', text: '成功删除商品' })})}).catch((e) => {console.log(e)})
}

 

6. 购物车页面-批量删除-本地

  • 定义批量删除商品的actions

// 批量删除购物车商品batchDeleteCart() {return new Promise((resolve, reject) => {const userStore = useUserStore()if (userStore.profile.token) {// 已登录} else {// 未登录// 遍历选中商品列表,一个个删除const selectedList = this.list.filter((goods) => goods.selected)selectedList.forEach((goods) => {this.deleteCart(goods.skuId)})}})},

 在购物车页面中点击删除所选商品时调用批量删除商品

// 批量删除商品
const batchDeleteCart = () => {Confirm({ text: '您确认从购物车中删除所选商品吗?' }).then(() => {// 点击确认按钮,触发resolve(),使用.then获得resolve的回调cartStore.batchDeleteCart().then(() => {Message({ type: 'success', text: '成功删除所选商品' })})})
}

 

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

django框架八

批量操作数据 自定义分页器(重在思路) form组件 modelform组件 cookie与session简介批量操作数据 浏览器访问一个django路由 立刻创建10万条数据并展示到前端页面create()、all() 涉及到大批量数据的创建 直接使用create可能会造成数据库崩溃批量数据创建>>>:bulk_cre…

07- 诊断事件diagnostic events的类图关系

文章目录 1 DEM模块的诊断事件diagnostic events的类图关系2 各个参数的含义介绍1 DEM模块的诊断事件diagnostic events的类图关系 这个时DEM模块的诊断事件diagnostic events的类图关系。 关于其在Davinci中的体现,请参考【06- 诊断事件DemEventParameter的配置】文章的介绍…

【日常】edge和chrome浏览器截屏工具快捷键

首先打开开发者工具 使用右键===>检查 就能打开开发者模式 在开发者模式下,快捷键ctrl+shift + p然后输入截屏,就能看到了 开源作品 GOFLY是一款基于Golang+Vue开发的在线客服系统,软件著作权编号:2021SR1462600。一套可私有化部署的在线客服系统,编译后的二进制文件可…

mysql在移机后的机器上配置(该机器重装了操作系统)

说明一切就绪后,唯有mysql没起来 连接本地数据库,mysql提示Can‘t connect to MySQL server on localhost (10061)解决办法_Geeca的博客-CSDN博客 https://blog.csdn.net/Geeca/article/details/125924886 本地无法启动MySQL服务,报的错误:1067,进程意外终止---解决_java奋…

PowerShell中异步方法的使用

问题 PowerShell脚本中有个文件上传功能,使用HttpClient 脱敏处理后基本就是这样子 $client = new-object System.Net.Http.HttpClient; $result = $client.PostAsync($URL,@{}).Result;别问为什么不用await,问就是有原因某天程序执行后,$result始终为空,也无异常 经过艰苦卓…

html对象常用属性和Window 对象属性

​/* *作者:呆萌老师 *☑csdn认证讲师 *☑51cto高级讲师 *☑腾讯课堂认证讲师 *☑网易云课堂认证讲师 *☑华为开发者学堂认证讲师 *☑爱奇艺千人名师计划成员 *在这里给大家分享技术、知识和生活 *各种干货,记得关注哦! *vx:it_daimeng */ html对象常用属性 取值赋值:inn…

Javaweb学习笔记第四弹

JDBC API详解 1、DriverManager作用: 1、注册驱动 registerDriver 2、获取数据库连接 getConnection 参数:1、url jdbc:mysql://localhost:3306/数据库名称 ​ 2、user 用户名 ​ 3、password 密码 注意:在url中,如果连接的是本机,并且…

Educational Codeforces Round 132 (Rated for Div. 2) A.B.D

A. Three Doors 题目链接&#xff1a; Problem - A - Codeforces 题面&#xff1a; 题意&#xff1a; 共有三扇门&#xff0c;一开始你有一把钥匙&#xff0c;有两扇门后面有钥匙&#xff0c;一扇门后面没有钥匙&#xff08;如果有钥匙&#xff0c;就会告诉你可以开哪扇门&am…

【Servlet】这一文详细的讲述了Servlet的知识,呕心沥血,终于文成。

文章目录什么是Servlet&#xff1f;Servlet的使用1、创建一个Web项目&#xff0c;并集成Tomcat2、引入Servlet的依赖3、创建一个Web启动类第一个是重写Servlet接口第二个是继承HttpServletServlet的理解Servlet的执行流程Servlet的生命周期加载和实例化阶段初始化阶段请求处理服…

202112-2 CCF 序列查询新解 (枚举 + 分段讨论 满分题解)

问题描述 序列查询新解 题目链接 解题思路 这个是上一道题目总结出来的规律 就是 f(x) i 当x属于 【a[i], a[i 1] &#xff09; 这个区间 也就是在这个区间里f(x)都等于一个数i 再看g(x)这个函数&#xff0c;g(x&#xff09; x / 常数&#xff0c;也可以知道&#xff0c;g…

微服务技术初探(go-micro)

微服务技术初探 微服务概述 微服务是近几年产生的新概念,与传统的单体式服务相比,微服务具有更好的扩展性及低耦合度等特性。微服务的重点在于服务的治理和调度。 微(micro):狭义来说就是体积小。 服务(service):区别于系统,服务一个或者一组相对较小且独立的功能单元,是…

c语言实现通讯录

目录标题通讯录的介绍通讯录的准备通讯录的初始化通讯录的添加通讯录的打印通讯录的查找并打印通讯录的删除通讯录的排序通讯录的修改通讯录的改善动态通讯录的实现以文件的形式存储通讯录的介绍 通讯录想必大家都应该不陌生&#xff0c;我们在手机里面都会有通讯录里面记录着…

爬虫数据可视化前的环境准备(已安装python环境前提下)

一、requests请求库安装 在桌面右键打开终端输入:pip install requests 二、Beautiful Soup解析库安装 终端输入:Beautiful Soup 4安装:pip install bs4 lxml安装:pip install lxml三、matplotlib安装下载miniconda下载地址:https://docs.conda.io/en/latest/miniconda.ht…

CF102411 ICPC 2019-2020 North-Western Russia Regional Contest题解

A Accurate Movement 签到 M Managing Difficulties 签到 B Bad Treap 已知\(y=\sin(x)\),要求给出数组\(a[n]\),满足\(\forall i,j\in[1,n],a[i]\neq a[j]\),都有\(\sin(a[i])\neq \sin(a[j])\)。 这里又一种不怎么玄的写法,就是我们找到一个整数\(x\),\(sin(x)\)非常非常…

计算机的概述

计算机是由硬件系统(hardware system)和软件系统(software system)两部分组成的。硬件系统电源电源是电脑中不可缺少的供电设备,它的作用是将220V交流电转换为电脑中使用的5V、12V、3.3V直流电,其性能的好坏,直接影响到电脑其他设备工作的稳定性,进而会影响整机的稳定性…

AXI MCDMA 仿真与工作流程分析

说明 关于背景知识,可以先看 https://www.cnblogs.com/xingce/p/16386108.html 引用一段官方的说明,AXI MCDMA存在的主要目的是为了节约资源,我们想要使用这个模块的主要目的也是为了降低资源消耗,从而可以将系统部署在更小面积的FPGA芯片上,当然,具体的效果还需要进一步…

软件定义网络第一次作业,问题与解决方法

软件定义网络第一次作业,问题与解决方法 实验结果截图:实验总结: 1.若使用VMware Workstation Pro。 版本最好使用20.04版本,网络较稳定且兼容性好。且22.04版本可能无法安装Vmware tools。 2.遇到网络无法访问,可尝试换源。 3.若需要压缩包,可在虚拟机中下载,或从电脑拖…

【kali】一款黑客们都在使用的操作系统

&#x1f495;&#x1f495;&#x1f495; 博主昵称&#xff1a;摆烂阳&#x1f495;&#x1f495;&#x1f495; &#x1f970;博主主页跳转链接 &#x1f469;‍&#x1f4bb;博主研究方向&#xff1a;web渗透测试 、python编程 &#x1f4c3; 博主寄语&#xff1a;希望本篇文…

共享单车需求量登记分类及影响因素分析——基于机器学习模型的比较分析

全文链接&#xff1a;http://tecdat.cn/?p28519 作者&#xff1a;Yiyi Hu 近年来&#xff0c;共享经济成为社会服务业内的一股重要力量。作为共享经济的一个代表性行业&#xff0c;共享单车快速发展&#xff0c;成为继地铁、公交之后的第三大公共出行方式。但与此同时&…

【笔记】Python网络爬虫与信息提取

实战&#xff1a;总结知识点疫情爬虫Re正则表达式Re库的使用scrapy爬虫框架介绍Scrapy常用命令网络爬虫技术亮点&#xff1a;1、采用requests发送请求&#xff0c;获取响应2、采用BeautifulSoup4解析页面数据3、采用正则表达式 提取不规则字符串4、采用json模块处理json格式数据…