过滤器vue
介绍过滤器本质上就是函数,做用在于用户输入数据后进行处理并返回一个结果。使用管道符(|)链接。json
分类api
内置过滤器数组
实例:markdown
{{'abc' | uppercase}} //'abc' => 'ABC'
这里使用了内置过滤器 uppercase ,将字符串改成大写。ide
自定义过滤器函数
特色this
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wNI8lqc8-1591182356367)(/Users/mxj/Library/Application Support/typora-user-images/image-20200603130112004.png)]atom
capitalize 、 uppercase 、 lowercase 用于处理英文字符,且仅对英文字符串使用。spa
capitalize
用于将表达式中的首字母转为大写。
{{ 'def' | capitalize}} // 'Def'
uppercase
用于将表达式中的全部字母转为大写。
lowercase
用于将表达式中的全部字母转为小写。
用于将字符串的值转换为 json 字符串,带有一个数值参数表示转换以后字符串的缩紧距离,默认为2。
<pre>{{ didFamily | json 4 }}</pre>
上例表示以4个空格打印一个json字符串
limitBy、filterBy、orderBy 用于处理并返回过滤后的数组。
limitBy
限制数组为开始的 N 个元素,N 由传入的第一个参数决定;第二个参数可选,指定数组的偏移量,默认为0,若是为5, 则表示从下标为5的地方开始计数。
//只显示开始的10个元素 <div v-for="item in items | limitBy 10" //显示第5到第10个元素 <div v-for="item in items | limitBy 10 5"
filterBy
过滤条件为:'function || string ’ + in + ‘optionKeyName’
若是搜索条件为多字符能够中间用空格隔开,返回包含过滤条件的数组。
<div v-for="user in users | filterBy 'Chrim' in 'name' 'nickname'" ></div>
也能够将搜索字段放到一个数组中,当修改搜索字段时只需修改数组便可,无需修改 View 层。
var names = ['name', 'nickname'] <div v-for="user in users | filterBy 'Chrim' in names" ></div>
orderBy
返回排序后的数组。
过滤条件是:‘string || array || function’ + ‘order>0为升序 || order < 0 为降序’,order 默认为 1, 即升序。
注释:当传入参数为 string 或 array 的时候,其原理是用的 sort 函数,只不过 vue 提早在内部作了处理。
currency 过滤器的做用是将数字值转换为货币形式输出。第一个参数为 String 的货币符号,若是不输入,则默认为美圆符号;第二个参数为 Number 的小数位,默认为2。
注意:若是第一个参数采起默认形式,而须要第二个参数修改小数位,那么第一个参数不可省略。
//默认状况 {{ amount | currency}} //12345 => $12,345.00 //使用人民币符号 {{ amount | currency '¥'}} //12345 => ¥12,345.00 //将小数位调整为 3 位 {{ amount | currency '$' 3}} //12345 => $12,345.000
debounce 过滤器的做用是延迟处理器必定的时间执行。参数为函数且必须,通常与 v-on 等指令结合使用;可选参数延迟时间,单位毫秒,默认为 300 毫秒。
应用:一般在监听用户 input 事件时使用 debounce 过滤器,能够防止频繁调用方法。
<input @keyup='onKeyup | debounce 500'自定义过滤器
大多数状况下内置的过滤器并不能知足咱们的需求,因此须要用到 自定义过滤器。其方法以下:
Vue 中有一个全局函数用于自定义过滤器:Vue.filter:
单个参数:实现将字符串反转
Vue.filter('reverse', function (value) { return value.splite('').reverse().join(''); }) <span v-text='message | reverse'></span>
多参数
多参数之间用空格分隔
Vue.filter('wrap', function (value, begin, end) { return begin + value + end; }) <span v-text="message | wrap 'before' 'agter'"></span> //'hello' => 'before hello after'
双向过滤器
上面的过滤器函数都是在 Model 数据输出到 View 层以前进行数据转化的,实际上 Vue.js 还支持把来自视图(input 元素) 的值在写回模型前进行转化,即双向过滤器。
Vue.filter(id, { //model -> viiew //read 函数可选 read: function(val) {}, //view -> model //write 函数将在数据被写入 Model 以前调用 //两个参数分别为表达式的新值和旧值 write: function(newVal, oldVal) {} })
若是过滤器参数和没有用引号包起来,则它会在 vm 做用域内动态计算。此外,过滤器函数的 this 始终指向调用它的 vm。
<input v-model='userInput'> <span>{{ msg | contact userInput}}</span> <!-- 此处过滤器接受的参数 userInput 根据用户输入动态计算 --> Vue.filter('concat', function (value, input) { return value + input })
给过滤器一个惟一标识
若是用户自定义的过滤器与内置过滤器冲突,那么内置过滤器会被覆盖;若是后注册的过滤器与以前的过滤器冲突,则以前注册的过滤器会被覆盖。
过滤器函数须要有返回值
过滤器函数的做用是输入表达式的值,通过处理后输出。所以,定义的函数最好能够返回有意义的值。函数没有 return 语句不会报错,但这样的过滤器没有意义。
在使用 filterBy 或 orderBy 对表达式进行过滤时,若是同时须要将 $index
做为参数,此时的 $index
将会根据表达式数组或对象过滤后的值进行索引。
<ul id="example"> <li v-for="item in items | order 'age'">{{ item.message}} - {{ $index }}</li> </ul> var example = new Vue({ el: '#example', data: { items: [ { message: '顺风车', age: 2}, { message: '出租车', age: 10}, { message: '快车', age: 6} ] } }) //最终显示顺序为:顺风车-0、快车-0、出租车-2
即索引为返回的新数组的索引。
自定义 filter 既能够写在全局的 Vue 下,也能够写在实例当中。可是须要注意的是,当写在全局 Vue 中时,要写在实例化 Vue 对象以前,不然不起做用。
全局 Vue
Vue.filter('reverse', function(value){ return value.split('').reverse.join(''); })
实例中
var demo = new Vue({ el: '#demo', data: {}, filters: { reverse: function (value){ return value.split('').reverse.join(''); } } })