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

【vue-9】购物车案例

  • 前导知识点:

1、table表格标签

<table> </table> 是用于定义表格的标签;

<thead></thead> 表头部(放表格的标题之类);
<tbody></tbody> 表主体(放表格主体数据);

 <tfoot></tfoot> 表脚注(放表格脚注);
<tr> </tr> 标签用于定义表格中的行,必须嵌套在 <table> </table>标签中;
 <td> </td> 用于定义表格中的单元格,即数据单元格的内容,必须嵌套在<tr></tr>标签中;  

 表格样式设置:

<style>table {width: 600px;color: 8f8e8e;text-align: center;border-collapse: collapse;}table thead {background-color: aqua;}table tr {height: 30px;line-height: 30px;border: 1px solid #ececec;}
</style>

2、let声明变量

 let和var的作用差不多,但let声明的范围是块作用域,而var声明的范围是函数作用域。 

  • 实现效果: 

  • 使用change事件实现购物车功能

完整示例代码: 

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>table {width: 600px;color: 8f8e8e;text-align: center;border-collapse: collapse;}table thead {background-color: aqua;}table tr {height: 30px;line-height: 30px;border: 1px solid #ececec;}</style>
</head>
<body><div id="app"><table><thead><tr><td><input type="checkbox" v-model="data.selected" @change="selectAll"/></td><td>商品</td><td>单价</td><td>库存</td><td colspan="2">操作</td></tr></thead><tbody><tr v-for="(value, index) in data.list"><td><input type="checkbox" :value="value" v-model="data.checkboxList" @change="checkSelect"/></td><td>{{value.name}}</td><td>{{value.price}}</td><td>{{value.stock}}</td><td><button @click="sub(value)">-</button>{{value.number}}<button @click="add(value)">+</button></td><td><button @click="del(index,value.id)">删除</button></td></tr></tbody><tfoot><tr><td>总价{{totalPrice()}}</td></tr></tfoot></table></div><script type="module">import {createApp, reactive} from './vue.esm-browser.js'// const {createApp, reactive} = VuecreateApp({// setup选项,用于设置响应式数据和方法等setup(){ const data = reactive({selected:false,checkboxList:[],list:[{id:1,name:"铅笔",price:10,number:5,stock:20},{id:2,name:"鼠标",price:20,number:5,stock:8},{id:3,name:"键盘",price:40,number:4,stock:7}],})const selectAll = () =>{console.log(data.selected)if(data.selected){data.checkboxList = data.list}else{data.checkboxList = []}console.log(data.checkboxList)}const checkSelect = () =>{if (data.checkboxList.length == data.list.length && data.list.length != 0){data.selected = true}else{data.selected = false}}const totalPrice = () =>{let total = 0console.log(data.checkboxList)for(let i = 0; i < data.checkboxList.length; i++){total += data.checkboxList[i].price*data.checkboxList[i].number}return total}const sub = (value) =>{value.number --if(value.number <= 1){value.number = 1}}const add =(value) =>{value.number++if(value.number >= value.stock){value.number = value.stock}}const del = (index,id) =>{data.list.splice(index,1)let newArr = data.checkboxList.filter((value,index) =>{return value.id != id})data.checkboxList = newArrcheckSelect()}return{data,selectAll,checkSelect,totalPrice,add,sub,del          }}}).mount("#app")// mount为挂载</script>
</body>
</html>
  • 使用watch侦听器与computed计算属性优化购物车案例 

去掉checkbox的change事件,添加如下代码: 

let flag = true
watch(()=>data.selected,(newValue,oldValue)=>{                    // console.log("newValue:",newValue,"oldValue:",oldValue)if(newValue){data.checkboxList = data.list}else{if(flag){data.checkboxList = []}                       }                    
})watch(()=>data.checkboxList,(newValue,oldValue)=>{                    console.log("newValue:",newValue.length,"oldValue:",oldValue)console.log(data.list.length)if (newValue.length == data.list.length && data.list.length != 0){data.selected = trueflag = true}else{flag = falsedata.selected = false}                 
})const totalPrice = computed(() => {return data.checkboxList.reduce((total, item) => total + item.price * item.number, 0)
})

reduce定义:用于对数组中所有元素进行迭代操作,并将每次操作的结果累加到一个初始值上;

输入参数:累加器函数、初始值,total(累加器)用于存储每次计算的结果,初始值为0,item(当前元素)在每次迭代过程中,当前元素的值会被传递给回调函数;

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • AWS无服务器 应用程序开发—第七章 邮件服务 发布订阅(Amazon SES)
  • 蓝桥杯软件赛Java研究生组/A组)第二章基础算法-第三节:倍增
  • 7.Nginx动静分离
  • 为什么电容两端电压不能突变
  • 关于Ubuntu24.04嘉立创EDA无法启动的问题
  • 为CAP面板添加简单的Authentication登录验证功能 C#|.net
  • Echarts 在折线图平滑位置处添加该处信息
  • 迅狐短视频矩阵管理系统核心功能
  • wordpress里面嵌入哔哩哔哩视频的方法
  • Flink任务如何跑起来之 1.DataStream和Transformation
  • (四)React组件、useState、组件样式
  • 男士内裤买便宜还是贵的?2024年高性价比男士内裤汇总分享
  • 戴尔R720服务器(4)虚拟机性能测试
  • feedparser - Python 解析Atom和RSSfeed
  • 49.Python-web框架-Django解决多语言redirect时把post改为get的问题
  • [译]如何构建服务器端web组件,为何要构建?
  • 2019年如何成为全栈工程师?
  • 30天自制操作系统-2
  • Android Volley源码解析
  • bearychat的java client
  • E-HPC支持多队列管理和自动伸缩
  • fetch 从初识到应用
  • Hibernate【inverse和cascade属性】知识要点
  • JavaScript学习总结——原型
  • Java多态
  • PHP那些事儿
  • Spring框架之我见(三)——IOC、AOP
  • 仿天猫超市收藏抛物线动画工具库
  • 近期前端发展计划
  • 浏览器缓存机制分析
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 世界上最简单的无等待算法(getAndIncrement)
  • 数据可视化之 Sankey 桑基图的实现
  • 为什么要用IPython/Jupyter?
  • 详解NodeJs流之一
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • Mac 上flink的安装与启动
  • 说说我为什么看好Spring Cloud Alibaba
  • # 数据结构
  • #13 yum、编译安装与sed命令的使用
  • $.proxy和$.extend
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (03)光刻——半导体电路的绘制
  • (2)STL算法之元素计数
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (二十三)Flask之高频面试点
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (十五)Flask覆写wsgi_app函数实现自定义中间件
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (转)Windows2003安全设置/维护
  • (转载)深入super,看Python如何解决钻石继承难题
  • (自用)gtest单元测试
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布