Vue.js 自定义过滤器

高洛峰

高洛峰

2016-11-23

1527人浏览

原创

过滤器,本质上就是一个函数。其作用在于用户输入数据后,它能够进行处理,并返回一个数据结果。

Vue.js 与 AngularJS 中的过滤器语法有些相似,使用管道符(|)进行连接,代码示例如下:

{{'abc' | uppercase}}    'abc' => 'ABC'

这里使用了Vue.js 内置的过滤器 uppercase,将字符串中的字母全部转换成大写形式。

Vue.js 支持在任何出现表达式的地方添加过滤器,除了上面例子中的 双大括号 表达式之外,还可以在绑定指令的表达式后调用,代码示例如下:

<div>
    <span></span>
</div>
 
<script></script><script>
    new Vue({
        el:&#39;#app&#39;,
        data:{
            message:&#39;hello world!&#39;
        }
    })
</script>

渲染为: =>  HELLO WORLD!

Vue 2.x 中,过滤器只能在 mustache 绑定中使用。为了在指令绑定中实现同样的行为,你应该使用计算属性。

过滤器可以串联:

{{ message | filterA | filterB }}

   

这里可以看一个例子:

<div>
    <h1>{{'ABCDE' |lowercase | capitalize }}</h1>
</div>
 
<script></script><script>
    new Vue({
        el:&#39;#app&#39;,
        data:{
            message:&#39;&#39;
        }
    })
</script>

   

lowercase 过滤器:把数据变成小写形式

capitalize过滤器:把首字母变成大写形式

// 'ABCDE' -> 'abcde' -> 'Abcde'

过滤器可以接受参数,参数跟在过滤器名称后面,参数之间以空格分隔。代码示例如下:

{{ message | filterA('arg1', arg2) }}

   

过滤器函数将始终以表达式的值作为第一个参数,带引号的参数会被当作字符串处理,而不带引号的参数会被当作数据属性名来处理。

这里的 message 将作为第一个参数,字符串arg1 作为第二个参数,表达式 arg2 的值在计算出来以后作为第三个参数传给过滤器。同时,Vue.js 的过滤器支持链式调用,上一个过滤器的输出结果可以作为下一个过滤器的输入

内置过滤器

1、字母操作

Vue.js 内置了 capitalize、uppercase、lowercase 三个过滤器用于处理英文字符。注意:这三个过滤器仅针对英文字符串使用

1-1、capitalize

capitalize 过滤器用于将表达式中的首字母转换为大写形式

{{'abc' | capitalize}}  // 'abc' => 'Abc'

   

1-2、uppercase

uppercase 过滤器用于将表达式中的所有字母转换为大写形式

{{'abc' | uppercase}}  // 'abc' => 'ABC'

   

1-3、lowercase

lowercase 过滤器用于将表达式中的所有字母转换为小写形式

{{'ABC' | lowercase}}  // 'ABC' => 'abc'

   

2、限制

Vue.js 中内置了 limitBy、filterBy、orderBy 三个过滤器用于处理并返回过滤后的数组,比如与v-for搭配使用。

注意:这三个过滤器所处理的表达式的值必须是数组,否则程序会报错

2-1、limitBy

limitBy 过滤器的作用是限制数组为开始前的 N 个元素,其中,N 由传入的第一个参数指定,表示限制几个,默认为 0, 即取全部的元素。第二个参数可选,用于指定从哪开始,比如:第一个参数是4,第二个参数是5,则表示取4个元素,从下标为5的元素开始。代码示例如下:

<div>
    <ul>
        <!--第二个参数不指定,即取全部,从0开始-->
        <li>{{item}}</li>
    </ul>
</div>
 
<script></script><script>
    new Vue({
        el:&#39;#app&#39;,
        data:{
            items:[1,2,3,4,5,6,7,8,9,10]
        }
    })
</script>

    

<div>
    <ul>
        <!--只显示5个元素,从0开始-->
        <li>{{item}}</li>
    </ul>
</div>

    

<div>
    <ul>
        <!--显示4个,从下标为3的元素开始  注意:下标是从0开始-->
        <li>{{item}}</li>
    </ul>
</div>

   

还可以这么使用:

<div>
    <ul>
        <!--取6个,从下标为4的元素开始  注意:数组的长度是arr.length -->
        <li>{{item}}</li>
    </ul>
</div>

   

2-2、filterBy

filterBy过滤器的使用比较灵活,其第一个参数可以是字符串或者函数,过滤条件是:'string || function' + in + 'optionKeyName'

如果第一个参数是字符串,那么将在每个数组元素中搜索它,并返回包含该字符串的元素组成的数组。代码示例如下:

<div>
    <ul>
        <li>{{val}}</li>
    </ul>
</div>
 
<script></script><script>
    new Vue({
        el:&#39;#app&#39;,
        data:{
            arr:[&#39;pear&#39;,&#39;orange&#39;,&#39;cherry&#39;,&#39;lemon&#39;]
        }
    })
</script>

   

如果数组元素是一个对象,过滤器将递归地在它所有属性中搜索。为了缩小搜索范围,可以指定一个搜索字段。代码示例如下:

<div>
    <input>
    <ul>
        <li>{{user.uname}}</li>
    </ul>
</div>
 
<script></script><script>
    new Vue({
        el:&#39;#app&#39;,
        data:{
            uname:&#39;&#39;,
            users:[
                {uname:&#39;Tom&#39;},
                {uname:&#39;Jerry&#39;},
                {uname:&#39;Kobe&#39;},
                {uname:&#39;James&#39;}
            ]
        }
    })
</script>

wKioL1g1FQKRNt6DAAAEXizhf1w010.pngwKioL1g1FQKRNt6DAAAEXizhf1w010.png

如果 filterBy 的第一个参数是函数,则过滤器将根据函数的返回结果进行过滤。此时 filterBy过滤器将调用 Javascript 数组中内置的函数 filter() 对数组进行处理,待过滤数组中的每个元素都将作为参数输入并执行传入 filterBy 中的函数。

只有函数返回结果为 true的数组元素才符合条件并将存入一个新的数组,最终返回结果即为这个新的数组。

2-3、orderBy

 orderBy 过滤器的作用是返回排序后的数组。过滤条件是:'string || array || function' + 'order>=0 为升序 || order

第一个参数可以是字符串、数组或者函数,第二个参数order可选,决定结果为升序或降序排列,默认为1,即升序排列

若输入参数为字符串,则可同时传入多个字符串作为排序键名,字符串之间以空格分隔。代码示例如下:


        
  •         {{user.lastName}} {{user.firstName}} {{user.age}}     

此时,将按照传入的排序键名的先后顺序进行排序。也可以将排序键名按照顺序放入一个数组中,然后传入一个数组参数给 orderBy 过滤器即可。代码示例如下:

<!--sortKey = [&#39;lastName&#39; &#39;firstName&#39; &#39;age&#39;];-->
        
  •         {{user.lastName}} {{user.firstName}} {{user.age}}     

    升序排列:

<div>
    <input>
    <ul>
        <li>
            {{val}}
        </li>
    </ul>
</div>
 
<script></script><script>
    new Vue({
        el:&#39;#app&#39;,
        data:{
            a:&#39;&#39;,
            arr:[&#39;pear&#39;,&#39;cherry&#39;,&#39;lemon&#39;,&#39;orange&#39;]
        }
    })
</script>

wKioL1g1FQKRNt6DAAAEXizhf1w010.png

降序排列:

<div>
    <input>
    <ul>
        <li>
            {{val}}
        </li>
    </ul>
</div>

   wKioL1g1FQKRNt6DAAAEXizhf1w010.png

3、json 过滤器

vue.js 2.0离线手册(CHM版)
vue.js 2.0离线手册(CHM版)

vue.js 2.0中文离线手册(CHM版)

下载

Vue.js 中的 json 过滤器本质上是 JSON.stringify() 的精简缩略版,可将表达式的值转换为 JSON 字符串,即输出表达式经过 JSON.stringify() 处理后的结果。

json 可接受一个类型为 Number 的参数,用于决定转换后的 JSON 字符串的缩进距离,如果不输入该参数,则默认为2。

不输入参数,默认为2的示例:

<div>
    <p>{{information | json}}</p>
</div>
 
<script></script><script>
    new Vue({
        el:&#39;#app&#39;,
        data:{
            information:{&#39;name&#39;:&#39;Roger&#39;, &#39;age&#39;:26}
        }
    })
</script>

wKioL1g1FQKRNt6DAAAEXizhf1w010.png

为了看到效果,我们输入一个参数20:

<div>
    <p>{{information | json 20}}</p> <!-- 以20个空格的缩进打印一个对象 -->
</div>

wKioL1g1FQKRNt6DAAAEXizhf1w010.png

4、currency 过滤器

currency 过滤器的作用是将数字值转换为货币形式输出。

第一个参数接受类型为 String 的货币符号,如果不输入,则默认为美元符号$。

第二个参数接受类型为 Number的小数位,如果不输入,则默认为2.

注意:如果第一个参数采取默认形式,而需要第二个参数修改小数位,则第一个参数不可省略

不输入参数,默认形式

<div>
    <h1>{{amount | currency}}</h1>
</div>
 
<script></script><script>
    new Vue({
        el:&#39;#app&#39;,
        data:{
            amount: &#39;12345&#39;
        }
    })
</script>

wKioL1g1FQKRNt6DAAAEXizhf1w010.png

使用其它货币符号:

<div>
    <h1>{{amount | currency '¥'}}</h1>
</div>

wKioL1g1FQKRNt6DAAAEXizhf1w010.png

将小数调整为3位:

<div>
    <h1>{{amount | currency '¥' 3}}</h1>
</div>

wKioL1g1FQKRNt6DAAAEXizhf1w010.png

5、debounce 过滤器

debounce 过滤器的作用是延迟处理一定的时间执行。其接受的表达式的值必须是函数,因此,一般与 v-on 等指令结合使用。

debounce 接受一个可选的参数作为延迟时间,单位为毫秒。如果没有该参数,则默认的延迟时间为300ms,经过 debounce 包装的处理器在调用之后将至少延迟设定的时间再执行。 如果在延迟结束前再次调用,则延迟时长将重置为设定的时间。

通常,在监听用户 input 事件时使用 debounce 过滤器比较有用,可以防止频繁调用方法。debounce 的用法参考如下:

<input>

自定义过滤器

1、filter语法

在Vue.js 中也存在一个全局函数 Vue.filter 用于构造过滤器:

Vue.filter(filterName, function(input){...})

该函数接受两个参数,第一个参数为自定义的过滤器名称,第二个参数则是具体的过滤器函数,过滤器函数以值为参数,返回转换后的值

2、单个参数

注册一个名为 reverse 的过滤器,作用是将字符串反转输出。代码示例如下:

<div>
    <input>
    <span>{{message}}</span>
</div>
 
<script></script><script>
    Vue.filter(&#39;reverse&#39;,function(message){
        return message.split(&#39;&#39;).reverse().join(&#39;&#39;);
    });
    new Vue({
        el:&#39;#app&#39;,
        data:{
            message:&#39;&#39;
        }
    })
</script>

wKioL1g1FQKRNt6DAAAEXizhf1w010.png

注册一个名为 double 的过滤器,作用是将数字补全成两位数输出。代码示例如下

<div>
    <input>
    <p>{{value}}</p>
</div>
 
<script></script><script>
    Vue.filter(&#39;double&#39;,function(value){
        return value<10? &#39;0&#39;+value : value
    });
    new Vue({
        el:&#39;#app&#39;,
        data:{
            value:&#39;&#39;
        }
    })
</script>

wKioL1g1FQKRNt6DAAAEXizhf1w010.png

注册一个名为 date 的过滤器,作用是将当前时间毫秒数以年月日时分秒的格式输出。代码示例如下:

<div>
    <p>{{message}}</p>
</div>
 
<script></script><script>
    Vue.filter(&#39;date&#39;,function(message){
        var now = new Date(message);
        return now.getFullYear()+&#39;-&#39;
                +(now.getMonth()+1)+&#39;-&#39;
                +now.getDate()+&#39; &#39;
                +(now.getHours()<12?&#39;0&#39;+now.getHours():now.getHours())+&#39;:&#39;
                +(now.getMinutes()<10?&#39;0&#39;+now.getMinutes():now.getMinutes())+&#39;:&#39;
                +now.getSeconds();
    });
    new Vue({
        el:&#39;#app&#39;,
        data:{
            message:Date.now()
        }
    })
</script>

wKioL1g1FQKRNt6DAAAEXizhf1w010.png

3、多个参数

过滤器函数除了以值作为参数外,也可以接受任意数量的参数,参数之间以空格分隔。代码示例如下:

<div>
    <input>
    <p>{{message}}</p>
</div>
 
<script></script><script>
    Vue.filter(&#39;wrap&#39;,function(value, begin, end){
        return begin +&#39; &#39;+ value + &#39; &#39;+ end
    });
    new Vue({
        el:&#39;#app&#39;,
        data:{
            message:&#39;&#39;
        }
    })
</script>

   wKioL1g1FQKRNt6DAAAEXizhf1w010.png

4、双向过滤器

上面的过滤器都是在 Model 数据输出到 View 层之前进行数据转化的,实际上 Vue.js 还支持把来自视图(input元素)的值在写回模型前进行转化,即双向过滤器

   
Vue.filter('filterName',{
    //model ---> view
    //read 函数可选
    read:function(val){
        ...
    },
     
    //view ---> model
    //write 函数将在数据被写入Model 之前调用
    //两个参数分别为表达式的新值和旧值
    write:function(newVal, oldVal){
        ...
    }
})

   

代码示例如下:

<div>
    <p>{{message}}</p>
    <input>
</div>
 
<script></script><script>
    Vue.filter(&#39;twoWayFilter&#39;,{
        read:function(val){
            return &#39;read&#39;+&#39; &#39;+val;
        },
        write:function(newVal, oldVal){
            return oldVal+&#39; &#39;+ &#39;write&#39;;
        }
    });
    new Vue({
        el:&#39;#app&#39;,
        data:{
            message:&#39;hello world&#39;
        }
    })
</script>

    在初始情况下,message 表达式的值经过 twoWayFilter 中的 read 函数处理,输出到 view 层

wKioL1g1FQKRNt6DAAAEXizhf1w010.png

当我们在 input 框中修改 message 的值时,twoWayFilter 中的 write 函数将在数据输出到 Model 层之前处理,这里将返回 message 的旧值 + 'write',然后输出到 Model层,因此 message的值变更为'hello world write' 并显示到页面上

wKioL1g1FQKRNt6DAAAEXizhf1w010.png

常见问题解析

1、filterBy/orderBy 过滤后 $index 的索引

在使用 filterBy 或者 orderBy 对表达式进行过滤时,如果同时需要将 $index 作为参数,此时的 $index将会根据表达式数组或对象过滤后的值进行索引


        
  •         {{item.name}} - {{$index}}     
  <script></script><script> new Vue({ el:&#39;#app&#39;, data:{ items:[ {name:&#39;Roger&#39;, age:26}, {name:&#39;Sarahling&#39;, age:27}, {name:&#39;Daisy&#39;, age:1} ] } }) </script>

   

2、自定义filter 的书写位置

自定义 filter 可以写在全局 Vue下,例如:

Vue.filter('reverse',function(message){
        return message.split('').reverse().join('');
    });

   

也可以写在Vue 实例当中,例如:

var vm = new Vue({
    el:'#example',
    data:{
         
    },
    filters:{
        //自定义 filter 事件的位置
        reverse:function(value){
            return value.split('').reverse().join('');
        }
    }
})

   

二者本质上并无区别,可任选一种使用。但是,采用Vue.filter 在全局定义时,需要在实例化 Vue 之前定义,否则自定义的 filter 不起作用

前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

vue.js

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
Selenium WebDriver元素定位与页面操作教程
Selenium WebDriver元素定位与页面操作教程

本专题整理Selenium WebDriver元素定位、XPath、CSS Selector、等待机制、窗口切换、Frame处理、Alert弹窗、Cookie操作和文件上传等核心用法。

2026.08.05

2

26

Selenium Grid分布式测试与并行执行教程
Selenium Grid分布式测试与并行执行教程

本专题整理Selenium Grid架构、远程WebDriver、并行测试、Docker部署、Kubernetes动态Grid、浏览器矩阵和测试环境扩展方法,适合进阶自动化测试团队使用。

2026.08.05

1

18

Selenium常见报错排查与自动化测试稳定性
Selenium常见报错排查与自动化测试稳定性

本专题整理Selenium常见报错、驱动版本问题、元素找不到、点击失败、等待超时、浏览器闪退、脚本不稳定和测试用例维护方法。

2026.08.05

0

17

墨刀AI提示词教学
墨刀AI提示词教学

本合集由PHP中文网精心整理,为您提供全面的墨刀AI提示词教学。内容涵盖高质量原型撰写公式与实操窍门,助您轻松掌握AI设计工具。无论是零基础入门还是进阶技巧,都能让您快速上手,大幅提升产品设计与协作效率。

2026.08.04

11

21

墨刀AI完整入门
墨刀AI完整入门

PHP中文网为您倾力打造墨刀AI保姆级入门指南完整版!本合集从零基础讲起,涵盖AI生成原型、提示词优化、图片转原型及多轮对话等核心功能。无论您是新手还是进阶用户,都能轻松掌握产品设计全流程。快来PHP中文网,一键解锁高效设计技巧,让想法即刻成型!

2026.08.04

8

20

墨刀AI进阶技巧
墨刀AI进阶技巧

本合集由PHP中文网精心整理,为您提供墨刀AI核心进阶策略指南。内容涵盖高效提示词写作、原型智能生成与微调、结构化导图制作及行业分析报告输出等实战技巧。助您轻松掌握AI设计工具,大幅提升产品设计与团队协作效率。

2026.08.04

10

14

火山引擎实名认证失败怎么办
火山引擎实名认证失败怎么办

火山引擎实名认证失败可能与证件信息填写错误、姓名或企业信息不一致、证件照片不清晰、营业执照状态异常、手机号验证失败或审核资料不完整有关。本专题整理个人认证、企业认证、资料上传、审核退回、重新提交和认证不通过的常见处理方法。

2026.08.04

5

10

火山引擎域名备案流程详解
火山引擎域名备案流程详解

火山引擎域名备案适合需要在火山引擎云服务器、对象存储、CDN或网站服务上绑定域名的用户参考。本专题整理备案入口、账号实名认证、备案类型选择、主体信息填写、网站信息提交、资料上传、初审核验、管局审核和备案失败排查,帮助用户完成网站上线前的备案流程。

2026.08.04

1

10

火山引擎DNS解析配置步骤
火山引擎DNS解析配置步骤

使用火山引擎DNS解析网站域名时,需要确认域名已完成管理接入,并正确配置服务器IP、CNAME地址或验证记录。本专题整理域名添加、记录类型选择、TTL设置、解析状态检查、备案和访问测试等流程,适合新手搭建网站时参考。

2026.08.04

3

10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Vue 教程
Vue 教程

共42课时 | 15.5万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1.3万人学习

Vue.js 微实战--十天技能课堂
Vue.js 微实战--十天技能课堂

共18课时 | 1.5万人学习