源碼
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue學習</title>
<script src="../vue.js"></script>
<script src="../vue-router.js"></script>
<style type="text/css"> span { cursor: pointer; } </style>
</head>
<body>
<div id="app">
<div>
課程:<input type="text" name="" v-model='course'>
價錢:<input type="text" name="" v-model='price'>
<button @click='addcourse'>添加商品</button>
</div>
<ul>
<li v-for='(list,index) in classlist'>
課程名稱:{{list.text}}---價格:{{list.price}}
<button @click='addtochat(index)'>添加到購物車</button>
</li>
</ul>
<chat :chatarr='chatarr'></chat>
</div>
<script type="text/javascript"> var Chat = { props: ['chatarr'], template: ` <div> 購物車 <table border="1"> <tr> <th>選中</th> <th>課程</th> <th>數量</th> <th>價格</th> </tr> <tr v-for="(chat,index) in chatarr"> <td><input type="checkbox" name="" v-model='chat.active'></td> <td>{{chat.text}}</td> <td> <span @click='reducecount(index)'>-</span> {{chat.count}} <span @click='addcount(index)'>+</span> </td> <td>{{chat.count * chat.price}}</td> </tr> <tr> <td colspan='2'>選中的課程:{{activeCount}}/{{count}}</td> <td colspan='2'>需付金額:{{totalpirce}}</td> </tr> </table> </div> `, computed: { activeCount() { return this.chatarr.filter(v => v.active).length }, count() { return this.chatarr.length }, totalpirce() { let total = 0 this.chatarr.forEach(v => { if (v.active) { total += v.price * v.count } }) return total } }, watch: { chatarr: { handler() { window.localStorage.setItem('chat', JSON.stringify(this.chatarr)) }, deep: true } }, methods: { addcount(index) { this.chatarr[index].count++ }, reducecount(index) { if (this.chatarr[index].count > 1) { this.chatarr[index].count-- } else { if (window.confirm(`是否刪除${this.chatarr[index].text}?`)) { this.chatarr.splice(index, 1) } } } } } new Vue({ el: '#app', components: {Chat}, data() { return { classlist: [ {text: 'springcloud', price: 20}, {text: 'vue', price: 30}, {text: 'js', price: 40}, {text: 'php', price: 50}, ], course: '', price: '', chatarr: [] } }, methods: { addcourse() { this.classlist.push({text: this.course, price: this.price}); this.course = ''; this.price = ''; }, addtochat(index) { const goods = this.classlist[index]; const result = this.chatarr.find(v => v.text == goods.text); if (result) { result.count += 1; } else { this.chatarr.push({...goods, count: 1, active: true}); } } }, created() { this.chatarr = JSON.parse(window.localStorage.getItem('chat')) } }) </script>
</body>
</html>
複製代碼