一 Vue 过滤器分类
过滤器分为两种,一种是局部过滤器,一种全局过滤器。所有的过滤器都是函数,并且参数为要过滤的数据。
局部过滤器:只允许在当前组件中使用
全局过滤器:所有组件都可以使用
二.局部过滤器
2.1 无传参局部过滤器
// 创建 Vue 实例,得到 ViewModel
var vm = new Vue({
el: '#app',
data: {
msg: 'filter'
},
methods: {},
//定义私用局部过滤器。只能在当前 vue 对象中使用
filters: {
dataFormat(msg) {
return msg+'xxxxx';
}
}
});
以上代码 filters 这个对象定义的就是局部过滤器,下面代码展示在组建中如何使用过滤器:
<div id="app">
<p>{{ msg | dataFormat}}</p>
// 结果 filterxxxxx
</div>
2.2 传参局部过滤器
当然你也应该在想,这样的过滤器使用起来可能会比较笨重,不够灵活,过滤器既然是函数,那是否可以传参呢?接下来我们通过参数让过滤器的使用变得更加灵活。
// 创建 Vue 实例,得到 ViewModel
var vm = new Vue({
el: '#app',
data: {
msg: 'filter'
},
methods: {},
//定义私用局部过滤器。只能在当前 vue 对象中使用
filters: {
// msg表示要过滤的数据
// a表示传入的参数
dataFormat(msg,a) {
return msg+a;
}
}
});
<!--html部分-->
<div id="app">
<p>{{ msg | dataFormat("你好")}}</p>
<!--结果 <p>filter你好</p>-->
</div>
三. 全局过滤器
3.1 定义无参全局过滤器
Vue.filter('msgFormat', function(msg) { // msg 为固定的参数 即是你需要过滤的数据
return msg.replace(/单纯/g, 'xxx')
})
完整示例
<div id\="app"\>
<p\>{{ msg | msgFormat}}</p\>
</div\>
<script\>
// 定义一个 Vue全局的过滤器,名字叫做msgFormat
Vue.filter('msgFormat', function(msg) {//字符串的replace方法,第一个参数,除了可写一个字符串之外,还可以定义一个正则
return msg.replace(/单纯/g, 'xx')
})
</script>
3.2 定义有参全局过滤器
<div id\="app"\>
<p\>{{ msg | msgFormat('疯狂','--')}}</p\>
</div\>
<script\>
// 定义一个 Vue 全局的过滤器,名字叫做 msgFormat
Vue.filter('msgFormat', function(msg, arg, arg2) {
//字符串的replace 方法,第一个参数,除了可写一个字符串之外,还可以定义一个正则
return msg.replace(/单纯/g, arg+arg2)
})
</script>
四.过滤器使用的位置
4.1.在双花括号插值
{{ 'ok' | globalFilter }}
4.2 在v-bind表达式中使用
<div v-bind:data="'ok' | globalFilter" ></div>
五.总结
- 全局的过滤器要比局部过滤器使用的更广泛一些,说白了我们为什么要使用过滤器,其实就跟使用函数是一样,我们想把一些方法封装,供其它组件使用,这样调用起来方便,开发更快捷。
- 过滤器并不是只可以使用一个,一个数据可以用多个过滤器,从左向右执行,注意的下一个过滤器接收的是上一个过滤器的处理结果,因此千万要注意使用顺序
{{ message | filterA | filterB }}
上述代码中,message是作为参数传给filterA 函数,而filterA 函数的返回值作为参数传给filterB函数,最终结果显示是由filterB返回的。
- 当有局部和全局两个名称相同的过滤器时候,会以就近原则进行调用,即:局部过滤器优先于全局过滤器被调用!
- 一个表达式可以使用多个过滤器。过滤器之间需要用管道符“|”隔开。其执行顺序从左往右
/*
一.全局过滤器
所有组件都可以使用
二.局部过滤器
局部过滤器的有参和无参的定义和使用方法与全局的过滤器一样。唯一的区别在于局部过滤器是定义在vue的实例中。
其作用的区域也是vue实例【#app】控制的区域
*/
//1.全局过滤器
Vue.filter('dateFormat', (time) => {
return moment().format("YYYY-MM-DD,HH:mm:ss")
})
new Vue({
el: "#app",
data: {
time: Date.now(),
money: 10000
},
filters: {
//2.局部过滤器
timeFormat(time) {
return moment().format('YYYY-MM-DD, HH:mm:ss a');
},
moneyFormat(money) {
return "¥" + money + "元"
}
}
})