Vue--使用watch、computed、filter方法来监控
watch与computed、filter:
watch:监控已有属性,一旦属性发生了改变就去自动调用对应的方法
computed:监控已有的属性,一旦属性的依赖发生了改变,就去自动调用对应的方法
filter:js中为我们提供的一个方法,用来帮助我们对数据进行筛选
watch与computed的区别:
1.watch监控现有的属性,computed通过现有的属性计算出一个新的属性
2.watch不会缓存数据,每次打开页面都会重新加载一次,
但是computed如果之前进行过计算他会将计算的结果缓存,如果再次请求会从缓存中
得到数据(所以computed的性能比watch更好一些)
一.watch监控使用小例子
1 <!DOCTYPE html> 2 <html lang="en"> 3 4 <head> 5 <meta charset="UTF-8"> 6 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 7 <meta http-equiv="X-UA-Compatible" content="ie=edge"> 8 <title>Document</title> 9 <script src="vue2.4.4.js"></script> 10 </head> 11 12 <body> 13 <div id="app"> 14 <input type="text" v-model="firstname"> 15 <input type="text" v-model="lastname"> 16 <span v-html="fullname"></span> 17 </div> 18 </body> 19 <script> 20 new Vue({ 21 el: "#app", 22 data: { 23 firstname:"", 24 lastname:"", 25 fullname:"" 26 }, 27 // 实时监控firstname,lastname,一旦其中优质发生了改变就需要重新设置fullname的值 28 // 可以使用watch来实现这个功能 29 watch:{ 30 // 将来只要firstname发生了改变它就会触发后面的这个方法 31 "firstname":function(){ 32 //只要firstname改变就应该相应的改变fullname 33 this.fullname = this.firstname+this.lastname; 34 }, 35 "lastname":function(){ 36 //只要lastname改变就应该相应的改变fullname 37 this.fullname = this.firstname+this.lastname; 38 } 39 } 40 }); 41 42 </script> 43 44 </html>
二.使用computed来监控
1 <!DOCTYPE html> 2 <html lang="en"> 3 4 <head> 5 <meta charset="UTF-8"> 6 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 7 <meta http-equiv="X-UA-Compatible" content="ie=edge"> 8 <title>Document</title> 9 <script src="vue2.4.4.js"></script> 10 </head> 11 12 <body> 13 <div id="app"> 14 <input type="text" v-model="firstname"> 15 <input type="text" v-model="lastname"> 16 {{fullName}} 17 </div> 18 </body> 19 <script> 20 new Vue({ 21 el: "#app", 22 data: { 23 firstname:"小", 24 lastname:"追命", 25 }, 26 computed:{ 27 fullName:function() { 28 return this.firstname+this.lastname ; 29 } 30 } 31 }); 32 </script> 33 </html>
三.使用filter方法来筛选元素
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 <meta http-equiv="X-UA-Compatible" content="ie=edge"> 7 <title>Document</title> 8 <script src="vue2.4.4.js"></script> 9 </head> 10 <body> 11 12 </body> 13 <script> 14 /** 15 filter:作用:过滤元素 16 操作:会遍历数据集合,去匹配所有的数据,将所有匹配成功的数据返回为一个新的数组 17 var newList = list.filter(function(item){ 18 return 匹配的条件; 19 如果里面的item满足匹配条件就会返回true,那么这个filter方法也会将对应的item值 20 返回给新的数组 21 }); 22 23 */ 24 var arr = [ 25 {name:"abc",age:18}, 26 {name:"hc",age:18}, 27 {name:"dbc",age:16}, 28 {name:"ayy",age:14}, 29 ]; 30 var str = "c"; 31 var newArr = arr.filter(function(item){ 32 // 查找newArr中所有name包含c的数据,然后返回 33 return item.name.indexOf(str) != -1; 34 }); 35 console.log(newArr); 36 </script> 37 </html>
四.使用filter方法完成品牌管理的搜索功能例子
1 <!DOCTYPE html> 2 <html lang="en"> 3 4 <head> 5 <meta charset="UTF-8"> 6 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 7 <meta http-equiv="X-UA-Compatible" content="ie=edge"> 8 <script src="vue2.4.4.js"></script> 9 <title>Document</title> 10 <style> 11 #app { 12 width: 600px; 13 margin: 10px auto; 14 } 15 16 .tb { 17 border-collapse: collapse; 18 width: 100%; 19 } 20 21 .tb th { 22 background-color: #0094ff; 23 color: white; 24 } 25 26 .tb td, 27 .tb th { 28 padding: 5px; 29 border: 1px solid black; 30 text-align: center; 31 } 32 33 .add { 34 padding: 5px; 35 border: 1px solid black; 36 margin-bottom: 10px; 37 } 38 </style> 39 </head> 40 41 <body> 42 <div id="app"> 43 <div class="add"> 44 编号: <input id="id" v-color="color" v-focus type="text" v-model="id">品牌名称: <input v-model="name" type="text"> 45 <button @click="add">添加</button> 46 </div> 47 <div class="add">品牌名称:<input v-model="searchValue" type="text"></div> 48 <div> 49 <table class="tb"> 50 <tr> 51 <th>编号</th> 52 <th>品牌名称</th> 53 <th>创立时间</th> 54 <th>操作</th> 55 </tr> 56 <tr v-if="list.length <= 0"> 57 <td colspan="4">没有品牌数据</td> 58 </tr> 59 <!--加入: key="index" 时候必须把所有参数写完整 --> 60 <tr v-for="(item,key,index) in newList" :key="index"> 61 <td>{{item.id}}</td> 62 <td>{{item.name}}</td> 63 <td>{{item.ctime | dateFrm("/")}}</td> 64 <!-- 使用vue来注册事件时,我们在dom元素中是看不到的 --> 65 <td><a href="javascript:void(0)" @click="del(item.id)">删除</a></td> 66 </tr> 67 </table> 68 </div> 69 70 </div> 71 </body> 72 73 </html> 74 75 <script> 76 // 使用全局过滤器(公有过滤器) 77 Vue.filter("dateFrm", function (time,spliceStr) { 78 // return "2017-11-16"; 79 var date = new Date(time); 80 //得到年 81 var year = date.getFullYear(); 82 // 得到月 83 var month = date.getMonth() + 1; 84 // 得到日 85 var day = date.getDate(); 86 return year + spliceStr + month + spliceStr + day; 87 }); 88 89 90 // 先将自定义指令定义好 91 // directive有两个参数 92 //参数一: 自定义指令 v-focus 93 //参数二: 对象,对象中可以添加很多方法 94 // 添加一个inserted方法:而这个方法中又有两个参数: 95 //参数一:el 当前使用自定义指令的对象 96 //参数二:obj 是指它(v-color="color" )后面设置的表达式 97 //{expression:"color",value:"red",} 98 Vue.directive("focus", { 99 inserted: function (el, obj) { 100 // console.log(el); 101 el.focus(); 102 } 103 }); 104 Vue.directive("color", { 105 inserted: function (el, obj) { 106 el.style.color = obj.value; 107 console.log(obj.value); 108 } 109 }); 110 111 var vm = new Vue({ 112 el: "#app", 113 data: { 114 searchValue:"", 115 color: "green", 116 id: 0, 117 name: '', 118 list: [ 119 { "id": 1, "name": "it", "ctime": Date() }, 120 { "id": 2, "name": "白狼", "ctime": Date() } 121 ] 122 }, 123 // mounted(){ 124 // this.getFocus() 125 // }, 126 computed:{ 127 newList:function(){ 128 if(this.searchValue =="") { 129 return this.list; 130 } 131 //改变this的指向 132 _this = this; 133 return this.list.filter(function(item){ 134 return item.name.indexOf(_this.searchValue)!=-1; 135 }); 136 } 137 }, 138 methods: { 139 add: function () { 140 //将id和namepush到list数组中 141 this.list.push({ "id": this.id, "name": this.name, "ctime": Date() }); 142 }, 143 del: function (id) { 144 145 // 根据id得到下标 146 // 默认去遍历list集合,将集合中的每个元素传入到function的item里, 147 var index = this.list.findIndex(function (item) { 148 //根据item中的id属性来判断这个item是否是上面id中 149 //对应的数据,如果是返回一个true ,否返回false,继续下面的一条数据的遍历,以此类推 150 return item.id == id; //如果返回true,那么findIndex方法会将这个item对应的id返回到外面接受 151 }); 152 // 根据下标在list集合中将对应的数据删除 153 // splice(开始删除的下标,删除的长度) 154 this.list.splice(index, 1); 155 } 156 157 } 158 }); 159 160 </script>