vue购物车实战

1.引入vue

<script src="https://cdn.jsdelivr.net/npm/vue@2.7.14/dist/vue.js"></script> 

2.设置高亮部分的样式

	<style> table tr{text-align: center;}.skyblue{background-color: skyblue;}</style> 

3.设置body的基本样式

<div id="app" >  <table border="1px solid black" style="width:500px;" ><thead><tr ><td>选中</td><td>图片</td><td>单价</td><td>个数</td><td>小计</td><td>操作</td></tr> </thead>	<tbody v-if="list.length>0"><tr v-for="(item,index) in list" :key="item.id" :class="{skyblue:item.isCheck}"><td><input type="checkbox" v-model="item.isCheck"></td> <td>{{item.name}}</td><td>{{item.price}}</td><td><button :disabled="item.num<=1" @click="sub(item.id)">-</button>{{item.num}}<button @click="add(item.id)">+</button></td><td>{{item.price*item.num}}</td><td> <button @click="del(item.id)">del</button> </td></tr> </tbody><tbody v-else><tr ><td colspan="6">空空如也</td> </tr> </tbody><tfoot><tr><td colspan="6" >全选<input type="checkbox" v-model="isAll">总价:¥ {{jiage}} <button @click="j()">结算{{zongshu}}</button></td></tr></tfoot></table></div> 

4.设置js的逻辑

		<script>const ddd =[{id:1,name:"苹果",price:30,num:3,isCheck:true},{id:2,name:"火龙果",price:50,num:10,isCheck:true},{id:3,name:"香蕉",price:20,num:300,isCheck:false},{id:4,name:"西瓜",price:100,num:20,isCheck:true},]const app=new Vue({el:'#app',data:{list:JSON.parse(localStorage.getItem("list"))||ddd},methods:{ del(a){this.list =	this.list.filter(item => item.id !== a )},add(a){const l=this.list.find(item=>item.id ===a)// console.log(l)l.num++},sub(a){const l=this.list.find(item=>item.id ==a)l.num--},j(){ var s=	this.list.reduce((sum,item)=>item.isCheck?sum+item.num:sum,0)var s1=	this.list.reduce((sum,item)=>item.isCheck?sum+item.num*item.price:sum,0)alert("您共购买"+s+"个商品,花了"+s1+"元")}},computed:{isAll:{get(){ return this.list.every(a=>a.isCheck===true)},set(a){this.list.forEach(b=>b.isCheck=a)} },jiage(){return this.list.reduce((a,b)=>(b.isCheck?a+b.num*b.price:a),0)},zongshu(){ return this.list.reduce((a,b)=>(b.isCheck?a+b.num:a),0)}},watch:{list:{ deep:true,//深度监视  handler(newValue){  localStorage.setItem("list",JSON.stringify(newValue))}   }  ,}  })</script>

完整代码如下

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>水果购物车</title><script src="https://cdn.jsdelivr.net/npm/vue@2.7.14/dist/vue.js"></script> <style> table tr{text-align: center;}.skyblue{background-color: skyblue;}</style> </head><body><div id="app" >  <table border="1px solid black" style="width:500px;" ><thead><tr ><td>选中</td><td>图片</td><td>单价</td><td>个数</td><td>小计</td><td>操作</td></tr> </thead>	<tbody v-if="list.length>0"><tr v-for="(item,index) in list" :key="item.id" :class="{skyblue:item.isCheck}"><td><input type="checkbox" v-model="item.isCheck"></td> <td>{{item.name}}</td><td>{{item.price}}</td><td><button :disabled="item.num<=1" @click="sub(item.id)">-</button>{{item.num}}<button @click="add(item.id)">+</button></td><td>{{item.price*item.num}}</td><td> <button @click="del(item.id)">del</button> </td></tr> </tbody><tbody v-else><tr ><td colspan="6">空空如也</td> </tr> </tbody><tfoot><tr><td colspan="6" >全选<input type="checkbox" v-model="isAll">总价:¥ {{jiage}} <button @click="j()">结算{{zongshu}}</button></td></tr></tfoot></table></div> <script>const ddd =[{id:1,name:"苹果",price:30,num:3,isCheck:true},{id:2,name:"火龙果",price:50,num:10,isCheck:true},{id:3,name:"香蕉",price:20,num:300,isCheck:false},{id:4,name:"西瓜",price:100,num:20,isCheck:true},]const app=new Vue({el:'#app',data:{list:JSON.parse(localStorage.getItem("list"))||ddd},methods:{ del(a){this.list =	this.list.filter(item => item.id !== a )},add(a){const l=this.list.find(item=>item.id ===a)// console.log(l)l.num++},sub(a){const l=this.list.find(item=>item.id ==a)l.num--},j(){ var s=	this.list.reduce((sum,item)=>item.isCheck?sum+item.num:sum,0)var s1=	this.list.reduce((sum,item)=>item.isCheck?sum+item.num*item.price:sum,0)alert("您共购买"+s+"个商品,花了"+s1+"元")}},computed:{isAll:{get(){ return this.list.every(a=>a.isCheck===true)},set(a){this.list.forEach(b=>b.isCheck=a)} },jiage(){return this.list.reduce((a,b)=>(b.isCheck?a+b.num*b.price:a),0)},zongshu(){ return this.list.reduce((a,b)=>(b.isCheck?a+b.num:a),0)}},watch:{list:{ deep:true,//深度监视  handler(newValue){  localStorage.setItem("list",JSON.stringify(newValue))}   }  ,}  })</script></body>
</html>

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

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

相关文章

人大金仓与mysql的差异与替换

人大金仓中不能使用~下面的符号&#xff0c;字段中使用”&#xff0c;无法识别建表语句 创建表时语句中只定义字段名.字段类型.是否是否为空 Varchar类型改为varchar&#xff08;长度 char&#xff09; Int(0) 类型为int4 定义主键&#xff1a;CONSTRAINT 键名 主键类型&#x…

Found option without preceding group in config file 问题解决

方法就是用记事本打开 然后 左上角点击 文件 有另存为 就可以选择编码格式

Linux设置程序任意位置执行(设置环境变量)

问题 直接编译出来的可执行程序在执行时需要写出完整路径比较麻烦&#xff0c;设置环境变量可以实现在任意位置直接运行。 解决 1.打开.bashrc文件 vim ~/.bashrc 2.修改该文件&#xff08;实现将/home/zhangziheng/file/seqrequester/build/bin&#xff0c;路径下的可执…

文件流【文件输入流】

文件流&#xff1a;使用文件输入流读取文件中的数据&#xff1a; public class FISDemo {public static void main(String[] args) throws IOException {//将fos.dat文件中的字节读取回来/*fos.dat文件中的数据:00000001 00000010*/FileInputStream fis new FileInputStream(…

第六节:Vben Admin权限-后端控制方式

系列文章目录 第一节:Vben Admin介绍和初次运行 第二节:Vben Admin 登录逻辑梳理和对接后端准备 第三节:Vben Admin登录对接后端login接口 第四节:Vben Admin登录对接后端getUserInfo接口 第五节:Vben Admin权限-前端控制方式 文章目录 系列文章目录前言一、角色权限(后端…

Java面试题总结6

Spring中有哪些设计模式 简单工厂&#xff1a;由一个工厂类根据传入的参数&#xff0c;动态决定应该创建哪一个产品类 工厂方法&#xff1a;实现FactoryBean接口的bean是一类叫做factory的bean 单例模式&#xff1a;保证一个类仅有一个实例&#xff0c;并提供一个访问它的全…

【办公类-18-03】(Python)中班米罗可儿证书批量生成打印(班级、姓名)

作品展示——米罗可儿证书打印幼儿姓名 背景需求 2024年3月1日&#xff0c;中4班孩子一起整理美术操作材料《米罗可儿》的操作本——将每一页纸撕下来&#xff0c;分类摆放、确保纸张上下位置正确。每位孩子们都非常厉害&#xff0c;不仅完成了自己的一本&#xff0c;还将没有…

C++数据结构与算法——二叉搜索树的属性

C第二阶段——数据结构和算法&#xff0c;之前学过一点点数据结构&#xff0c;当时是基于Python来学习的&#xff0c;现在基于C查漏补缺&#xff0c;尤其是树的部分。这一部分计划一个月&#xff0c;主要利用代码随想录来学习&#xff0c;刷题使用力扣网站&#xff0c;不定时更…

C++编程面试复盘:数组降重+快排+函数指针+类模板

面试真题 真题1 #include <iostream> // 在函数 find_repetnum 的参数列表中&#xff0c;int& length 中的 & 符号表示引用。通过将 length 声明为引用&#xff0c;函数可以修改传入的 length 变量的值&#xff0c;并且这种修改会在函数外部生效。 void find_r…

Vue2:路由history模式的项目部署后页面刷新404问题处理

一、问题描述 我们把Vue项目的路由模式&#xff0c;设置成history 然后&#xff0c;build 并把dist中的代码部署到nodeexpress服务中 访问页面后&#xff0c;刷新页面报404问题 二、原因分析 server.js文件 会发现&#xff0c;文件中配置的路径没有Vue项目中对应的路径 所以…

React withRouter的使用及源码实现

一 基本介绍 作用&#xff1a; 把不是通过路由切换过来的组件中&#xff0c;将react-router 的 history、location、match 三个对象传入props对象上。比如首页&#xff01; 默认情况下必须是经过路由匹配渲染的组件才存在this.props&#xff0c;才拥有路由参数&#xff0c;才能…

嵌入式学习笔记Day27

今天主要学习了进程间的通信&#xff0c;主要学习了通过管道进行通信 一、进程间的通信 进程间的通信方式有以下几种&#xff1a; 1.管道 2.信号 3.消息队列 4.共享内存 5.信号灯 6.套接字二、管道 2.1无名管道 无名管道只能用于具有亲缘关系的进程间通信 函数接口&#x…

Nacos进阶

目录 Nacos支持三种配置加载方案 Namespace方案 DataID方案 Group方案 同时加载多个配置集 Nacos支持三种配置加载方案 Nacos支持“Namespacegroupdata ID”的配置解决方案。 详情见&#xff1a;Nacos config alibaba/spring-cloud-alibaba Wiki GitHub Namespace方案…

《TCP/IP详解 卷一》第12章 TCP初步介绍

目录 12.1 引言 12.1.1 ARQ和重传 12.1.2 滑动窗口 12.1.3 变量窗口&#xff1a;流量控制和拥塞控制 12.1.4 设置重传的超时值 12.2 TCP的引入 12.2.1 TCP服务模型 12.2.2 TCP可靠性 12.3 TCP头部和封装 12.4 总结 12.1 引言 关于TCP详细内容&#xff0c;原书有5个章…

【C++ map和set】

文章目录 map和set序列式容器和关联式容器键值对setset的主要操作 mapmap主要操作 multiset和multimap map和set 序列式容器和关联式容器 之前我们接触的vector,list,deque等&#xff0c;这些容器统称为序列式容器&#xff0c;其底层为线性序列的的数据结构&#xff0c;里面存…

【LV14 day4 字符设备驱动基础框架】

一、字符设备驱动框架解析 设备的操作函数如果比喻是桩的话&#xff08;性质类似于设备操作函数的函数&#xff0c;在一些场合被称为桩函数&#xff09;&#xff0c;则&#xff1a; 驱动实现设备操作函数 ----------- 做桩 insmod调用的init函数主要作用 --------- 钉桩 rm…

都说了能不动就别动,非要去调整,出生产事故了吧

MyBatis 替换成 MyBatis-Plus 背景介绍 一个老项目&#xff0c;数据库用的是 MySQL 5.7.36 &#xff0c; ORM 框架用的 MyBatis 3.5.0 &#xff0c; mysql-connector-java 版本是 5.1.26 新来了一个干练的小伙&#xff0c;精力充沛&#xff0c;看着就是一个喜欢折腾的主 他…

leetcode 3.1

leetcode hot 100 双指针1.三数之和2.接雨水 多维动态规划1.最长公共子序列 双指针 1.三数之和 三数之和 排序 双指针的方法&#xff0c;固定一个数nums[i], 用两数和找target - nums[i] 的数需要注意两点: 1.需要去掉重复数字 while (l < r && nums[l] nums[…

社交APP开发能给用户带来什么

现在的社交软件也非常的多&#xff0c;每款社交软件都有自己的特色&#xff0c;社交软件是日常中必备的软件&#xff0c;不管是生活交流还是感情工作交流都是比较方便的&#xff0c;因为社交软件满足了日常的远程交流问题&#xff0c;所以开发社交软件也会逐渐的流行起来的。 …

Error: T doesn‘t have .length

Error: T doesn‘t have .length 在 TypeScript 中&#xff0c;当我们使用泛型 <T> 时&#xff0c;有时会遇到一个常见问题&#xff1a;编译器提示错误&#xff0c;指出泛型类型 T 不具备 .length 属性。在本文中&#xff0c;我们将探讨这个问题的解决方案&#xff0c;并…