vue监听购物车数量变化及实现模糊查询
要点:使用过滤器和计算属性
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>vue监听购物车数量及模糊查询</title> <script src="vue.js"></script> <!-- 引入样式 --> <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css"> <script src="https://unpkg.com/element-ui/lib/index.js"></script> </head> <body> <div id="app"> <div style="margin: 10px 0;"> <label>名称搜索:</label> <input v-model="searchInput" type="text" placeholder="请输入查询内容" style="width:300px;padding: 5px;"> </div> <el-table :data="searchData" border style="width: 100%"> <el-table-column label="图片"> <template slot-scope="scope"> <img :src="scope.row.url"> </template> </el-table-column> <el-table-column prop="name" sortable label="商品名称"> </el-table-column> <el-table-column sortable label="商品数量"> <template slot-scope="scope"> <el-button @click="scope.row.count-=1" :disabled="scope.row.count<=0" >-</el-button> <span>{{scope.row.count}}</span> <el-button @click="scope.row.count+=1" :disabled="scope.row.count<=10" >+</el-button> </template> </el-table-column> <el-table-column prop="price" sortable label="商品单价"> </el-table-column> <el-table-column sortable label="商品金额"> <template slot-scope="scope"> <span>{{scope.row.count*scope.row.price | priceFilter(3)}}</span> </template> </el-table-column> <el-table-column prop="" sortable label="操作"> <template> <el-button>商品详情</el-button> </template> </el-table-column> </el-table> <div>{{totalCount}}件商品总计(不含运费):¥{{totalAmount}}</div> </div> <script type="text/javascript"> var vm = new Vue({ el: "#app", data:{ searchInput:'', items:[{ name:'苹果',price:10,count:10,url:'./images/unlock.png' },{ name:'车厘子',price:34,count:2,url:'./images/unlock.png' },{ name:'火龙果',price:30,count:3,url:'./images/unlock.png' },{ name:'桃子',price:20,count:10,url:'./images/unlock.png' }] }, filters:{ // 过滤器,文本格式化 priceFilter:function(data,n){ return '¥'+data.toFixed(n) // 保留2位小数 } }, computed:{ // 计算属性 searchData:function(){ var self =this // filter() 筛选 // 现在输入文字之后没有查到结果,因为this的指向不对,在回调函数和定时器中this的指向是window if (!this.searchInput) return this.items; return this.items.filter(function(item){ return item.name.indexOf(self.searchInput)!=-1 }) }, totalCount:function(){ // var n=0; // this.items.forEach(function(item,index){ // n+=item.count // }); // return n; // 换一种写法,将这里的items换成searchData,因为当我们查询了指定的水果之后,总计的数量和金额也要显示当前查询的 return this.searchData.reduce(function(total,cur){ return total+cur.count },0) //0 表示初始化的值 }, totalAmount:function(){ return this.searchData.reduce(function(total,cur){ return total+cur.count*cur.price },0) } } }) // 数组的reduce方法:var arr =[1,2,3,1,2,5] // var a =arr.reduce(function(total,cur){ // return total+cur // },10) 10是初始值,表示在10的基础上相加 // total就是前面所加的和,cur指当前的数组值 // 模糊查询前端可以做,但是如果数据是分页展示的,建议后端做模糊查询,因为每次点击页码来展示数据的时候,是向后端接口传参,然后返回数据,前端做模糊查询的话是在所有数据都有的情况下做模糊查询 // 其他:数组实例的find()方法,用于找出第一个符合条件的数组成员。它的参数是一个回调函数,所有数组成员依次执行该回调函数,直到找出第一个返回值为true的成员,然后返回该成员。如果没有符合条件的成员,则返回undefined。
数组实例的findIndex()方法的用法与find()方法非常类似,返回第一个符合条件的数组成员的位置,如果所有成员都不符合条件,则返回-1
</script> </body> </html>
reduce的其他用法:
1)最简单的就是我们常用的数组求和,求乘积了
var arr = []; var sum = arr.reduce(function(prev, cur, index, arr) { console.log(prev, cur, index); return prev + cur; },0) console.log(arr, sum); // [] 0
高级用法:
2)(1)计算数组中每个元素出现的次数
let names = ['Alice', 'Bob', 'Tiff', 'Bruce', 'Alice']; let nameNum = names.reduce((pre,cur)=>{ if(cur in pre){ pre[cur]++ }else{ pre[cur] = 1 } return pre },{}) console.log(nameNum); //{Alice: 2, Bob: 1, Tiff: 1, Bruce: 1}
(3)数组去重
let arr = [1,2,3,4,4,1] let newArr = arr.reduce((pre,cur)=>{ if(!pre.includes(cur)){ return pre.concat(cur) }else{ return pre } },[]) console.log(newArr);// [1, 2, 3, 4]
(4)将二维数组转化为一维
let arr = [[0, 1], [2, 3], [4, 5]] let newArr = arr.reduce((pre,cur)=>{ return pre.concat(cur) },[]) console.log(newArr); // [0, 1, 2, 3, 4, 5]
(5)将多维数组转化为一维
let arr = [[0, 1], [2, 3], [4,[5,6,7]]] const newArr = function(arr){ return arr.reduce((pre,cur)=>pre.concat(Array.isArray(cur)?newArr(cur):cur),[]) } console.log(newArr(arr)); //[0, 1, 2, 3, 4, 5, 6, 7]
(6)对象里的属性求和
var result = [ { subject: 'math', score: 10 }, { subject: 'chinese', score: 20 }, { subject: 'english', score: 30 } ]; var sum = result.reduce(function(prev, cur) { return cur.score + prev; }, 0); console.log(sum) //60
加油!

浙公网安备 33010602011771号