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