案例工程结构:
index.html:
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>Title</title>
- <link rel="stylesheet" href="style.css">
- </head>
- <body>
-
- <div id="app">
- <div v-if="books.length">
- <table>
- <thead>
- <tr>
- <th></th>
- <th>书籍名称</th>
- <th>出版日期</th>
- <th>价格</th>
- <th>购买数量</th>
- <th>操作</th>
- </tr>
- </thead>
- <tbody>
- <tr v-for="(item, index) in books">
- <td>{{item.id}}</td>
- <td>{{item.name}}</td>
- <td>{{item.date}}</td>
- <td>{{item.price | showPrice}}</td>
- <td>
- <button @click="decrement(index)" v-bind:disabled="item.count <= 1">-</button>
- {{item.count}}
- <button @click="increment(index)">+</button>
- </td>
- <td><button @click="removeHandle(index)">移除</button></td>
- </tr>
- </tbody>
- </table>
- <h2>总价格: {{totalPrice | showPrice}}</h2>
- </div>
- <h2 v-else>购物车为空</h2>
- </div>
-
- <script src="../js/vue.js"></script>
- <script src="main.js"></script>
- <script>
- </script>
- </body>
- </html>
-
main.js
- const app = new Vue({
- el: '#app',
- data: {
- books: [
- {
- 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
- },
- ]
- },
- methods: {
- // getFinalPrice(price) {
- // return '¥' + price.toFixed(2)
- // }
- increment(index) {
- this.books[index].count++
- },
- decrement(index) {
- this.books[index].count--
- },
- removeHandle(index) {
- this.books.splice(index, 1)
- }
- },
- computed: {
- totalPrice() {
- let totalPrice = 0
- for (let i = 0; i < this.books.length; i++) {
- totalPrice += this.books[i].price * this.books[i].count
- }
- return totalPrice
-
- // for (let i in/of this.books)
- // reduce
- }
- },
- filters: { //vue过滤器
- showPrice(price) {
- return '¥' + price.toFixed(2)
- }
- }
- })
-
style.css:
- 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;
- }
-
效果展示: