平时我们在vue中使用过滤器时,在组件中定义的过滤器不能在其他组件中使用,所以要在每个组件中定义自己的filter,这样就会出现很多重复的代码,那有没有办法定义一个公用的filter,减少代码的重复呢?
下面就给大家展示下使用最多且有效的方法吧!
首先在公用js中定义一个通用的filter.js,如下图所示,记得一定要把代码整个export出来
const vFilter={
numFilter:function (value) {
// 截取当前数据到小数点后两位
let realVal = Number(value).toFixed(2)
return realVal
}
}
export default vFilter
然后在main.js中引入
import vueFilter from './js/filter'
for (let key in vueFilter){
Vue.filter(key,vueFilter[key])
}
这样我们就可以在组件中尽情使用啦,比如说
<p class="goods-info-p ">¥{{goodsItem.goodsPrice|numFilter}}</p>
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <script src="vue.js"></script> <style> </style> </head> <body> <div id="app"> <!--输出的字符串中a的个数--> <span>msg的值:{{msg}},其中a的个数:</span> {{msg | myfilter('a')}} <br> <!--输出的字符串中b的个数--> <span>msg的值:{{msg}},其中b的个数:</span> {{msg | myfilter | myfilternumber}} </div> </body> <script type="text/javascript"> Vue.filter("myfilter", function(value, arg) { //返回一个对象或者json字符串,列出字符串中的字符以及字符的个数,不区分大小写 var obj = {}; var s = value.split('').sort().join(""); var reg = /(.)\1+/ig; var str = s.replace(reg, "$1"); //字符串去重后的结果 var i = 0, n, a; while (s.length > 0) { a = str.charAt(i); n = s.lastIndexOf(a) + 1; obj[a] = n; s = s.substring(n); i++; } return arg ? obj[arg] : obj; }); Vue.filter("myfilternumber", function(value) { return value.b; }); var app1 = new Vue({ el: "#app", data: { msg: "a1a1aba2babac" }, methods: { } }); </script> </html>