3. 过滤器¶
Vue.js 允许在表达式后面添加可选的过滤器,以管道符表示。
过滤器的本质是一个函数,接受管道符前面的值作为初始值,同时也能接受额外的参数,返回值为经过处理后的输出值。多个过滤器也可以进行串联。
备注
{{ message | filterA | filterB }}
在这个例子中,filterA 被定义为接收单个参数的过滤器函数,表达式 message 的值将作为参数传入到函数中。然后继续调用同样被定义为接收单个参数的过滤器函数 filterB,将 filterA 的结果传递到 filterB 中。
{{ message | filterA('arg1', arg2) }}:
filterA 被定义为接收三个参数的过滤器函数。其中 message 的值作为第一个参数,普通字符串 ‘arg1’ 作为第二个参数,表达式 arg2 的值作为第三个参数。
3.1. 过滤器注册¶
Vue.js 提供了全局方法 Vue.filter() 注册一个自定义过滤器,接受过滤器 ID 和过滤器函数两个参数。需要注意的是,过滤器可以用在两个地方:双花括号插值和 v-bind 表达式 (后者从 2.1.0+ 开始支持)。
<div id="date-filter">
<h1>{{new_date | format-date}}</h1>
</div>
Vue.filter('format-date',function(value){
return value.getMonth()
})
var vm=new Vue({
el:'#date-filter',
data:{
new_date:new Date(),
}
})
备注
除了可以通过全局定义一个过滤器,也可以同自定义指令一样定义一个组件内的过滤器。在Vue()实例内使用参数filters定义对应过滤器。
new Vue({
...
filters: {
capitalize: function (value) {
if (!value) return ''
value = value.toString()
return value.charAt(0).toUpperCase() + value.slice(1)
}
}
...
})
3.2. 双向过滤器¶
之前提及的过滤器都是在数据输出到视图之前,对数据进行转化显示,但不影响数据本身。Vue.js 也提供了在改变视图中数据的值,写回 data 绑定属性中的过滤器,称为双向过滤器。
从使用场景和功能来看,双向过滤器和第 2 章中提到的计算属性有点雷同。若对写操作有转化要求的数据,建议使用计算属性这一特性来实现。 点击前往 。
3.3. 动态参数¶
过滤器除了能接受单引号(‘’)括起来的参数外,也支持接受在 vm 实例中绑定的数据,称之为动态参数。使用区别就在于不需要用单引号将参数括起来。
<div id="dynamic-filter">
<p>动态参数</p>
<span>{{date | dynamic('string-args',price)}}</span>
</div>
var dynamic = new Vue({
el: '#dynamic-filter',
data: {
date: new Date(),
price: [151,151,151]
},
filters:{
'dynamic': function(date,string,price) {
return date.toLocaleString()+" : "+string+" : "+ price;
}
}
})