效果如下:
可以添加和减少商品个数(最少个为1),在添加的时候总价格会随着改变,也可以点击按钮移除商品
代码分为三个模块(html、js、css)
html部分:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>书籍购物车</title>
<link href="./index.css" rel="stylesheet" type="text/css">
</head>
<body>
<div id="app"></div>
<template id="my-app">
<template v-if="books.length > 0">
<table>
<thead>
<th>序号</th>
<th>书集名称</th>
<th>出版日期</th>
<th>价格</th>
<th>购买数量</th>
<th>操作</th>
</thead>
<tbody>
<tr v-for="(book,index) in books" :key="index">
<td>{{index+1}}</td>
<td>{{book.name}}</td>
<td>{{book.publicationDate}}</td>
<td>{{formatPrice(book.price)}}</td>
<td>
<button :disabled="book.count<=1" @click="decrement(index)">-</button>
<span class="count">{{book.count}}</span>
<button @click="increment(index)">+</button>
</td>
<td>
<button @click="removeBook(index)">移除</button>
</td>
</tr>
</tbody>
</table>
<h2>总价格:{{formatPrice(totalPrice)}}</h2>
</template>
<template v-else>
<div class="empty">购物车为空</div>
</template>
</template>
<script src="../js/vue3.js"></script>
<script src="./index.js"></script>
</body>
</html>
js部分:
const App = {
template: '#my-app',
data() {
return {
books: [
{
id: 1,
name: '乱世佳人',
publicationDate: '2007-09-02',
price: '42',
count: 1,
},
{
id: 2,
name: '幸福来敲门',
publicationDate: '2007-09-02',
price: '54',
count: 1,
},
{
id: 3,
name: '弱点',
publicationDate: '2007-09-02',
price: '65',
count: 1,
},
{
id: 4,
name: '楚门的世界',
publicationDate: '2007-09-02',
price: '43',
count: 1,
}
]
}
},
computed: {
totalPrice() {
let finalPrice = 0;
for (let book of this.books) {
finalPrice += book.count * book.price;
}
return finalPrice
}
},
methods: {
// 点击加
increment(index) {
this.books[index].count++;
},
// 点击减
decrement(index) {
this.books[index].count--;
},
// 点击移除
removeBook(index) {
this.books.splice(index, 1)
},
// 在价格前面加上¥符号
formatPrice(price) {
return "¥" + price
}
},
}
Vue.createApp(App).mount('#app')
css部分:
table{
border: 1px solid #e9e9e9;
border-collapse: collapse;
border-spacing: 0;
}
th,td{
padding: 8px 16px;
border: 1px solid #e9e9e9;
}
th{
background-color: #f7f7f7;
color: #5c6b77;
font-weight: 600;
}
.count{
margin: 0 5px;
}
.empty{
margin-left: 80px;
margin-top: 50px;
font-size: 30px;
}