<!DOCTYPE html>
<html lang="en"> <head>
<meta charset="UTF-8">
<title>index</title>
<style>
table {
border: 1px solid #e9e9e9;
border-collapse: collapse;
border-spacing: 0;
} th,
td {
padding: 8px 16px;
border: 1px solid #e9e9e9;
text-align: left;
} th {
background-color: #f7f7f7;
color: #5c6b77;
font-weight: 600;
}
</style>
</head> <body> <div id="app">
<!-- 如果list有内容,渲染购物车内容 -->
<div v-if="list.length">
<table>
<thead>
<tr>
<!-- id -->
<th></th>
<th>书籍名称</th>
<th>出版日期</th>
<th>价格</th>
<th>购买数量</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<!-- 给tr写入list的循环 -->
<!-- 不建议直接遍历整个对象,而是用item.name之类的方式写入数据,方便加入+-的按钮等操作 -->
<!-- 获取index是很重要der -->
<tr v-for="(item, index) in list" :key="item.id">
<!-- index每次循环+1 -->
<td>{{index + 1}}</td>
<td>{{item.name}}</td>
<td>{{item.date}}</td>
<!-- 价格建议保留两位小数,数据有.00 但渲染的时候被省略掉了 -->
<td>{{item.price|showPrice}}</td>
<!-- 可以直接让显示的内容保留两位小数点
由于总价有同样的需求,可以封装函数
-->
<!-- <td>{{'¥' + item.price.toFixed(2)}}</td> --> <td>
<!-- 如果count小于等于0 就禁用button -->
<!-- 给加减的button分别注册点击加减数字的事件 -->
<button :disabled="item.count<=0" @click="increment(index)">-</button>
<span>{{item.count}}</span>
<button @click="decrement(index)">+</button>
</td>
<td>
<!-- 点击移除事件 -->
<button @click="removeItem(index)">移除</button>
</td>
</tr>
</tbody>
</table>
<!-- 计算并渲染总价(保留两位小数点并拼接¥符号) -->
<h2>总价格: {{totalPrice | showPrice}}</h2>
</div>
<!-- 如果购物车莫得东西,显示这个 -->
<div v-else>购物车没有书籍!</div>
</div>
<script src="https://cdn.bootcss.com/vue/2.6.9/vue.js"></script>
<script>
const app = new Vue({
el: '#app',
data: {
// books 的list
list: [{
id: 1,
name: '《算法导论》',
date: '2006-9',
price: 85.00,
count: 1
},
{
id: 2,
name: '《UNIX编程艺术》',
date: '2006-2',
price: 59.00,
count: 1
},
{
id: 3,
name: '《编程珠玑》',
date: '2008-10',
price: 39.00,
count: 1
},
{
id: 4,
name: '《代码大全》',
date: '2006-3',
price: 128.00,
count: 1
},
]
},
computed: {
// 计算总价
totalPrice() {
// 箭头函数
return this.list.reduce((preValue, item) => {
// 单价乘数量
// preValue是之前已经添加的价格 item是(回调中的array)是list中每一项
// reduce(callback,innitialValue)
// callback对数组中的所有元素调用指定的回调函数。 返回值为累积结果,并且此返回值在下一次调用该回调函数时作为参数提供。
// callback 如果提供了 initialValue, 则 reduce 会对数组中的每个元素调用一次 callback.如果未提供 initialValue,则 reduce方法会对从第二个元素开始的每个元素调用 callbackfn 函数。
// 回调函数语法 function callbackfn(previousValue, currentValue, currentIndex, array1)
return preValue + item.price * item.count
// 0是初始值
}, 0)
}
},
filters: {
// 过滤器 这个东西放在methods里不如放在过滤器里
// 过滤器不改变真正的data,而只是改变渲染的结果,并返回过滤后数据
showPrice(price) {
return '¥' + price.toFixed(2)
}
},
methods: {
// 增加和减少让count++ -- ,然后vue会自动把变化的数据渲染到页面
//根据index判断要改的哪一行的count
increment(index) {
this.list[index].count--
// console.log(index);
},
decrement(index) {
this.list[index].count++
},
// 点击移除时,获取当前行index splice(要移除的位置,移除的列数),移除当前list行
removeItem(index) {
this.list.splice(index, 1)
}
},
})
</script>
</body> </html>

注释写的挺全的,所以就不做过多说明了~~

博客地址 :https://www.cnblogs.com/sandraryan/

vue实现购物车逻辑的更多相关文章

  1. 使用vue模拟购物车小球动画

    使用vue模拟购物车小球动画 1.效果演示 2.相关代码 <!DOCTYPE html> <html lang="en"> <head> < ...

  2. 如何以python风格高逼格的改成购物车逻辑

    之前有一篇博文写到关于购物车的业务逻辑,分别运用cookie和redis存储未登录和登录用户的购物车数据,虽然已经很好的完成了业务逻辑,但是会发现代码的冗余很严重,也不够具有python特色,今天就让 ...

  3. Vue实战-购物车案例

    Vue实战-购物车案例 普通购物车 实现的功能:添加商品到购物车,计算总价 <!DOCTYPE html> <html lang="en"> <hea ...

  4. vue实战记录(五)- vue实现购物车功能之商品总金额计算和单选全选删除功能

    vue实战,一步步实现vue购物车功能的过程记录,课程与素材来自慕课网,自己搭建了express本地服务器来请求数据 作者:狐狸家的鱼 本文链接:vue实战-实现购物车功能(五) GitHub:sue ...

  5. vue实战记录(六)- vue实现购物车功能之地址列表选配

    vue实战,一步步实现vue购物车功能的过程记录,课程与素材来自慕课网,自己搭建了express本地服务器来请求数据 作者:狐狸家的鱼 本文链接:vue实战-实现购物车功能(六) GitHub:sue ...

  6. vue实战记录(四)- vue实现购物车功能之过滤器的使用

    vue实战,一步步实现vue购物车功能的过程记录,课程与素材来自慕课网,自己搭建了express本地服务器来请求数据 作者:狐狸家的鱼 本文链接:vue实战-实现购物车功能(四) GitHub:sue ...

  7. vue实战记录(三)- vue实现购物车功能之渲染商品列表

    vue实战,一步步实现vue购物车功能的过程记录,课程与素材来自慕课网,自己搭建了express本地服务器来请求数据 作者:狐狸家的鱼 本文链接:vue实战-实现购物车功能(三) GitHub:sue ...

  8. vue实战记录(二)- vue实现购物车功能之创建vue实例

    vue实战,一步步实现vue购物车功能的过程记录,课程与素材来自慕课网,自己搭建了express本地服务器来请求数据 作者:狐狸家的鱼 本文链接:vue实战-实现购物车功能(二) GitHub:sue ...

  9. vue实战记录(一)- vue实现购物车功能之前提准备

    vue实战,一步步实现vue购物车功能的过程记录,课程与素材来自慕课网,自己搭建了express本地服务器来请求数据 作者:狐狸家的鱼 本文链接:vue实战-实现购物车功能(一) GitHub:sue ...

随机推荐

  1. CentOS7配置中文支持与部署GitLab服务器

    给你的 CentOS 7 安装中文支持 1.首先需要中文字体以便支持命令行终端的中文显示需求: yum groupinstall "fonts" 碰到提示输入 y 回车继续安装,大 ...

  2. Nginx 日志切割后无法记日志

    日志切割会向Nginx Pid发送一个信号重新打开日志文件,如果nginx.conf没有配置PID,切割日志后找不到PID文件,就会出问题

  3. 【CodeVS】【2004年NOIP全国联赛提高组】1057 津津的储蓄计划

    1057 津津的储蓄计划 2004年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 青铜 Bronze 题目描述 Description 津津的零花钱一直都是 ...

  4. Hdu 1068 最小路径覆盖

    Girls and Boys Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  5. C位域的初步了解

    以为C中的东西了解的差不多了...今天却是第一次才看到位域这个概念, 闲来无事的时候读起了编程之美,看一个问题的时候有种解答用到了位域, 位域的结构体定义,变量声明和结构体很相似: struct (结 ...

  6. 双系统删除ubuntu

    我的电脑安装了双系统,Windows和Linux,不过由于Linux在最近一段时间内不会使用,所以我打算删除Linux.    删除Linux最需要注意的地方,就是MBR(Master Boot Re ...

  7. JavaScript之HTML DOM Document 对象

    文档对象代表您的网页. 如果您希望访问 HTML 页面中的任何元素,那么您总是从访问 document 对象开始. 下面是一些如何使用 document 对象来访问和操作 HTML 的实例. 查找 H ...

  8. 修改mysql数据库密码的3中方法

    方法1: 用SET PASSWORD命令 mysql -u root mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('newpass ...

  9. word之图表目录中点号位置提升3磅

  10. 深入浅出Cocoa之消息【转】

    在入门级别的ObjC 教程中,我们常对从C++或Java 或其他面向对象语言转过来的程序员说,ObjC 中的方法调用(ObjC中的术语为消息)跟其他语言中的方法调用差不多,只是形式有些不同而已. 譬如 ...