在vue項目中我們經常需要對數據進行處理,比如需要將時間戳處理成時間節點,或者將時間節點處理成時間戳等等。
在項目中可以注冊全局過濾器,也可以在組件中注冊過濾器。
1、 注冊全局過濾器
ps:注冊全局過濾器,必須在new Vue實例之前注冊。Vue.filter()
1 Vue.filter(名稱,function(value){// 業務邏輯})
1 // 轉為大小字母 2 Vue.filter('strToUpperCase', function (str) { 3 if (!str) { 4 return str; 5 } 6 return str.toString().toUpperCase(); 7 }); 8 // 轉為小寫字母 9 Vue.filter('strToLowerCase', function (str) { 10 if (!str) { 11 return str; 12 } 13 return str.toString().toLowerCase(); 14 }); 15 // vue實例 16 new Vue({ 17 render: h => h(App), 18 store, 19 router 20 }).$mount('#app');
2、組件中注冊過濾器
1 <template> 2 <div> 3 <input type="text" v-model.number="val" /> 4 <div>輸入框的值(小於10在前面補0):{{val|addZero}}</div> 5 <div :title="val|addZero">鼠標懸浮在我上面顯示的是輸入框的值補0</div> 6 7 <div>{{'Hello'|addWorld}}</div> 8 </div> 9 </template> 10 <script> 11 export default { 12 data() { 13 return { 14 val: undefined 15 }; 16 }, 17 filters: { 18 // 數字補0 19 addZero(val) { 20 if (isNaN(val)) { 21 return val; 22 } else { 23 if (val < 10) { 24 return "0" + val; 25 } else { 26 return val; 27 } 28 } 29 }, 30 // Hello后面加 World 31 addWorld(str) { 32 if (str === "Hello") { 33 return str + " World!"; 34 } 35 } 36 }, 37 created() {}, 38 methods: {} 39 }; 40 </script> 41 <style scoped> 42 </style>
過濾器中的第一個參數是 “|” 前的值,過濾器中不能獲取 this,因為當我們需要傳參的時候,可以在使用中去傳參,也可以過濾器疊在一起使用。
1 <template> 2 <div> 3 <!-- 過濾器也是可以傳參數的 --> 4 <div>{{name}}的英文是:{{name|getEnglish(list)}}</div> 5 6 <!-- 過濾器疊在一起使用,name作為filter1的第一個參數,filter1返回的值作為filter2的第一個參數,最后顯示filter2的返回值 --> 7 <div>疊加顯示:{{name|filter1|filter2}}</div> 8 </div> 9 </template> 10 <script> 11 export default { 12 data() { 13 return { 14 name: "蘋果", 15 list: [ 16 { name: "蘋果", english: "apple" }, 17 { name: "香蕉", english: "banner" }, 18 { name: "橘子", english: "orange" } 19 ] 20 }; 21 }, 22 filters: { 23 getEnglish(val, list) { 24 // 過濾器中不能獲得vue實例 25 console.log("this:", this); // undefined 26 var eng = ""; 27 list.forEach(one => { 28 if (one.name === val) { 29 eng = one.english; 30 } 31 }); 32 return eng; 33 }, 34 filter1(val) { 35 return val + "過濾器1"; 36 }, 37 filter2(val) { 38 return val + "過濾器2"; 39 } 40 }, 41 created() {}, 42 methods: {} 43 }; 44 </script> 45 <style scoped> 46 </style>
總結:
1. 全局過濾器注冊必須在new Vue實例之前,Vue.filter(名稱,function(val){// 業務邏輯})
2. 組件中注冊過濾器使用,filters:{名稱1:function(val){},名稱2:function(val){}},注意:組件中注冊的單詞是“f-i-l-t-e-r-s”,全局注冊沒有s。
3. 過濾器中不能獲得 this,但使用時可以傳參,也可以疊加使用過濾器,如:<div>{{name|filter1(list)|filter2}}</div>