vue实现购物车逻辑
<!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实现购物车逻辑的更多相关文章
- 使用vue模拟购物车小球动画
使用vue模拟购物车小球动画 1.效果演示 2.相关代码 <!DOCTYPE html> <html lang="en"> <head> < ...
- 如何以python风格高逼格的改成购物车逻辑
之前有一篇博文写到关于购物车的业务逻辑,分别运用cookie和redis存储未登录和登录用户的购物车数据,虽然已经很好的完成了业务逻辑,但是会发现代码的冗余很严重,也不够具有python特色,今天就让 ...
- Vue实战-购物车案例
Vue实战-购物车案例 普通购物车 实现的功能:添加商品到购物车,计算总价 <!DOCTYPE html> <html lang="en"> <hea ...
- vue实战记录(五)- vue实现购物车功能之商品总金额计算和单选全选删除功能
vue实战,一步步实现vue购物车功能的过程记录,课程与素材来自慕课网,自己搭建了express本地服务器来请求数据 作者:狐狸家的鱼 本文链接:vue实战-实现购物车功能(五) GitHub:sue ...
- vue实战记录(六)- vue实现购物车功能之地址列表选配
vue实战,一步步实现vue购物车功能的过程记录,课程与素材来自慕课网,自己搭建了express本地服务器来请求数据 作者:狐狸家的鱼 本文链接:vue实战-实现购物车功能(六) GitHub:sue ...
- vue实战记录(四)- vue实现购物车功能之过滤器的使用
vue实战,一步步实现vue购物车功能的过程记录,课程与素材来自慕课网,自己搭建了express本地服务器来请求数据 作者:狐狸家的鱼 本文链接:vue实战-实现购物车功能(四) GitHub:sue ...
- vue实战记录(三)- vue实现购物车功能之渲染商品列表
vue实战,一步步实现vue购物车功能的过程记录,课程与素材来自慕课网,自己搭建了express本地服务器来请求数据 作者:狐狸家的鱼 本文链接:vue实战-实现购物车功能(三) GitHub:sue ...
- vue实战记录(二)- vue实现购物车功能之创建vue实例
vue实战,一步步实现vue购物车功能的过程记录,课程与素材来自慕课网,自己搭建了express本地服务器来请求数据 作者:狐狸家的鱼 本文链接:vue实战-实现购物车功能(二) GitHub:sue ...
- vue实战记录(一)- vue实现购物车功能之前提准备
vue实战,一步步实现vue购物车功能的过程记录,课程与素材来自慕课网,自己搭建了express本地服务器来请求数据 作者:狐狸家的鱼 本文链接:vue实战-实现购物车功能(一) GitHub:sue ...
随机推荐
- Zookeeper安装过程
zookeeper的安装我反反复复安装了三次,前两次在root用户下安装都失败了,都启动不起来,第三次我改成普通用户安装,没想到成功了,很不可思议,步骤完全一样,接下来介绍一下具体的安装步骤: 1. ...
- JS 防止重复提交
JS 防止重复提交表单 利用flag自定义设置,缺点就是当页面有很多类似操作时,每次需要一个 方法二: var newtime = 0; function sub(){ var Today = new ...
- 【模板】Vector存图 + SPFA
最近愉快地决定要由边集数组转向Vector存图,顺便开始图论集训 老惯例,以题写模板 P1339 [USACO09OCT]热浪Heat Wave 题目描述 The good folks in Texa ...
- ubuntu上用源码进行一键安装mysql
首先卸载原有的mysql: 首先查看自己的mysql有哪些依赖 #dpkg --list|grep mysql 先卸载 #sudo apt-get remove mysql-common #sud ...
- stack的基本使用方式
#include <iostream> #include <stack>//头文件 using namespace std; stack<int> S; int m ...
- python 中if __name__=="__main__"
if __name__=="__main__":表示当执行运行文件为当前代码所在文件时,则会执行if__name__=="__main__":后的语句. 如果这 ...
- 解决CSDN博客插入代码出现的问题
我在写CSDN博客的时候有时候会在插入代码之后继续编辑,然后保存之后经常会出现一些多余的符号<p 例如<pre></pre>,这样的标记,其实这是html的一个元素,pr ...
- 基于mcp940反编译Minecraft源代码
引言 Minecraft中文叫"我的世界",没怎么深入玩过,来试试把它源代码反编译出来吧. 参考教程: https://minecraft.gamepedia.com/Mods/C ...
- Direct2D 第5篇 绘制图像
原文:Direct2D 第5篇 绘制图像 我加载的图像是一张透明底PNG图像,背景使用渐变的绿色画刷 #include <windows.h> #include <d2d1.h> ...
- 深入浅出Javascript闭包
一.引子 闭包(closure)是 Javascript 语言的一个难点,面试时常被问及,也是它的特色,很多高级应用都要依靠闭包实现.本文尽可能用简单易懂的话,讲清楚闭包的概念.形成条件及其常见的面试 ...