
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name=referrer content=never> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <link href="https://cdn.bootcss.com/twitter-bootstrap/4.3.1/css/bootstrap.css" rel="stylesheet"> <script src="https://cdn.bootcss.com/vue/2.6.10/vue.js"></script> <script src="https://cdn.bootcss.com/axios/0.19.0-beta.1/axios.js"></script> <style> img { width: 40px; height: 65px; } .count { width: 40px; } </style></head><body> <div id="app" class="container"> <h2 class="text-success text-center">购物车</h2> <table class="table table-bordered table-hover"> <thead> <tr> <th>全选 <input type="checkbox" v-model="checkAll" @change="change"></th> <th>商品</th> <th>单价</th> <th>数量</th> <th>小计</th> <th>操作</th> </tr> </thead> <tbody> <tr v-for="(item,index) of products"> <td><input type="checkbox" @change="handleItem()" v-model="item.isSelected"></td> <td><img :src="item.productCover" :alt="item.productName"> {{item.productName}}</td> <td>{{item.productPrice}}</td> <td><input class="count" v-model.number="item.productCount" type="number" min="1"></td> <td>{{item.productPrice*item.productCount | toFixed}}</td> <td><button class="btn btn-danger" @click="remove(index)">删除</button></td> </tr> </tbody> </table> <p>总价格:{{sum() | toFixed}}</p> </div> <script> var vm = new Vue({ el: "#app", filters: { toFixed(value) { return "$" + value.toFixed(2) } }, data: { products: [], checkAll: false }, mounted() { axios.get('./data/carts.json').then(res => { this.products = res.data }) this.handleItem() }, methods: { remove(index) { this.products.splice(index, 1) }, change() { console.log(this.checkAll) this.products.forEach(item => item.isSelected = this.checkAll) }, handleItem(){ /* 根据列表项点击的结果控制全选的结果 */ this.checkAll = this.products.every(item=>item.isSelected) }, sum(){ // alert(1) var sum = 0; this.products.forEach(item=>{ sum = item["productCount"]*item["productPrice"]+sum; console.log(sum) }) return sum; } } }) </script></body></html>
一、sum()求和带来的问题
//只要products改变的时候,sum函数就会触发。这样不利于性能优化
二、使用computed属性改造代码
2-1 计算属性控制选中和没有选中的状态
var vm = new Vue({ el: "#app", ... computed:{ checkAll:{ /* products值变化时会重新计算 */ get(){ return this.products.every(item=>item.isSelected) }, set(val){ //给checkbox赋值的时候触发 this.products.forEach(item=>item.isSelected = val) } } }, data: { products: [] }, mounted() { axios.get('./data/carts.json').then(res => { this.products = res.data }) } })
2-2 计算总价格
computed:{ .... sum(){ /* sum的值会被缓存,如果依赖的数据没有变化不会重新执行 */ var total = 0; this.products.forEach(item=>{ total = item['productPrice']*item['productCount']+total; }) return total; } }