VueJs 自定义过滤器使用总结

过滤器是一个通过输入数据,能够及时对数据进行处理并返回一个数据结果的简单函数。Vue有很多很便利的过滤器,可以参考官方文档, http://cn.vuejs.org/api/#过滤器 ,过滤器通常会使用管道标志 “ | ”, 比如:

 {{ msg | uppercase  }}

  // ‘abc‘ => ‘ABC‘

在上述的例子中,在插值的时候,使用了Vue的一个uppercase过滤器,msg可以是直接写死,写成{{ ‘abc’ | uppercase }},也可以利用用户输入来改变msg的值。

uppercase过滤器 : 将输入的字符串转换成大写字母的过滤器。

链式过滤

VueJs允许你链式调用过滤器,简单的来说,就是一个过滤器的输出成为下一个过滤器的输入,然后再次过滤。接下来,我们可以想象一个比较简答的例子,使用了Vue的 filterBy + orderBy 过滤器来过滤所有商品products。过滤出来的产品是属于电器类商品,并且按电器字母排序。

filterBy过滤器 : 过滤器的值必须是一个数组,filterBy + 过滤条件。过滤条件是:‘string || function’ + in ‘optionKeyName’

orderBy过滤器 : 过滤器的值必须是一个数组,orderBy + 过滤条件。过滤条件是:‘string || array ||function’ + ‘order ≥ 0 为升序 || order < 0 为降序’

接下来,我们可以看下第二个例子:我们有一个商品数组products,我们希望遍历这个数组,并把他们打印成一张清单,这个用v-for很容易实现。

<li v-for="product in products">
      {{ product.name | capitalize }} - {{ product.price | currency }}
</li>

capitalize过滤器 : 将输入的字符串首字母转换成大写字母的过滤器。currency过滤器 : 将输入的数字转换成现金的过滤器。可以跟上货币符号(默认$)和保留的小数位(默认2)。

利用上面的两个过滤器,能够很好的把一个json数组的商品清单格式化成通熟易懂的商品价格清单。

如果只想要电器类商品,可以在v-for上加过滤条件:

<li v-for="product in products | filterBy ‘electronics‘ in ‘category‘ ">
      {{ product.name | capitalize }} - {{ product.price | currency }}
</li>

上面的例子,就是用filterBy 过滤在 ‘category‘中含有‘electronics‘ 关键字的列表,返回的列表就是只含有 ‘electronics‘ 关键字的列表。

如果想要多个搜索条件:

<li v-for="product in products | filterBy ‘electronics‘ in ‘category‘  ‘name‘ ">
      {{ product.name | capitalize }} - {{ product.price | currency }}
</li>

上面的例子,就是用filterBy 过滤在 ‘category‘ 和 ‘name‘ 中含有‘electronics‘ 关键字的列表。

最后我们还需要将这个列表用字母进行排序。我们可以在 filterBy 过滤器的基础上,链式调用orderBy 过滤器。

<ul>
       <li v-for="product in products
                   | filterBy ‘electronics‘ in ‘category‘
                   | orderBy  ‘name‘ "
       >
            {{ product.name | capitalize }} - {{ product.price | currency }}
      </li>
</ul>

orderBy 的排序方式默认是升序,如果想要降序,只需要加一个小于0的参数:

<li v-for="product in products
           | filterBy ‘electronics‘ in ‘category‘
           | orderBy  ‘name‘  -1 "
>

自定义过滤器

虽然VueJs给我们提供了很多强有力的过滤器,但有时候还是不够。值得庆幸的,Vue给我们提供了一个干净简洁的方式来定义我们自己的过滤器,之后我们就可以利用管道 “ | ” 来完成过滤。

定义一个全局的自定义过滤器,需要使用Vue.filter()构造器。这个构造器需要两个参数。

Vue.filter() Constructor Parameters:

1.filterId: 过滤器ID,用来做为你的过滤器的唯一标识;

2.filter function: 过滤器函数,用一个function来接收一个参数,之后再将接收到的参数格式化为想要的数据结果。

回到之前的例子:现在设想我们有一个网上商城,并给我们的所有商品打五折。

为了完成这个例子,我们需要完成的是

  • 使用Vue.filter()构造器创建一个过滤器叫做discount
  • 输入商品的原价,能够返回其打五折之后的折扣价
  Vue.filter( ‘discount‘ , function(value) {
        return value  * .5 ;
  });

  new Vue({
        el : ‘body‘,
        data : {
              products : [
                    {name: ‘microphone‘, price: 25, category: ‘electronics‘},
                    {name: ‘laptop case‘, price: 15, category: ‘accessories‘},
                    {name: ‘screen cleaner‘, price: 17, category: ‘accessories‘},
                    {name: ‘laptop charger‘, price: 70, category: ‘electronics‘},
                    {name: ‘mouse‘, price: 40, category: ‘electronics‘},
                    {name: ‘earphones‘, price: 20, category: ‘electronics‘},
                    {name: ‘monitor‘, price: 120, category: ‘electronics‘}
              ]
        }
  });

现在就可以像使用Vue自带的过滤器一样使用自定义过滤器了

<ul>
      <li v-for="product in products">
           {{ product.name | capitalize }} - {{ product.price | discount | currency }}
      </li>
</ul>

上面的html代码将会输出打了五折之后的所有商品的清单列表。

那如果我们想要的是任意折扣呢?我们应该在discount过滤器里增加一个折扣数值参数,改造一下我们的过滤器。

  Vue.filter( ‘discount‘ , function(value,discount) {
        return value  * ( discount / 100 ) ;
  });

然后重新调用我们的过滤器

<ul>
      <li v-for="product in products">
           {{ product.name | capitalize }} - {{ product.price | discount 25 | currency }}
      </li>
</ul>

我们也可以在我们Vue实例里构造我们的过滤器,这样构造的好处是,这样就不会影响到其他不需要用到这个过滤器的Vue实例。

  new Vue({
        el : ‘body‘,
        data : {
              products : [
                    {name: ‘microphone‘, price: 25, category: ‘electronics‘},
                    {name: ‘laptop case‘, price: 15, category: ‘accessories‘},
                    {name: ‘screen cleaner‘, price: 17, category: ‘accessories‘},
                    {name: ‘laptop charger‘, price: 70, category: ‘electronics‘},
                    {name: ‘mouse‘, price: 40, category: ‘electronics‘},
                    {name: ‘earphones‘, price: 20, category: ‘electronics‘},
                    {name: ‘monitor‘, price: 120, category: ‘electronics‘}
              ]
        },
        filters: {
              discount : function(value, discount){
                    return value * ( discount / 100 );
              }
        }
  });

定义在全局就能在所有的实例中调用过滤器,如果定义在了实例里就在实例里调用过滤器。

多亏了简洁的管道过滤器构造器,我们不仅可以调用它原生的过滤器,也可以自定义属于我们自己的过滤器。但是Vue2.0好像把它去掉了。不过我想,如果是用1.0的朋友还是很需要用到过滤器的 : )

时间: 2024-08-27 16:16:40

VueJs 自定义过滤器使用总结的相关文章

Django中自定义过滤器的使用

我在这里做的是: 从数据库查出id递增的一些信息,展示在前台. 编写一个过滤器判断查出数据的id是偶数的返回True 奇数返回False 1 创建项目,创建应用,注册应用,配置settings.py文件,配置urls映射,编写views试图,编写模板templates,编写models模块 切记 注册应用.  很多伙伴找不到自己定义的过滤器,是因为忘记注册应用! 2 创建过滤器的目录: 实际上,在项目目录或者应用目录下创建都是可以的,创建一个名为templatetags的python模块 在我这

lucene自定义过滤器

先介绍下查询与过滤的区别和联系,其实查询(各种Query)和过滤(各种Filter)之间非常相似,可以这样说只要用Query能完成的事,用过滤也都可以完成,它们之间可以相互转换,最大的区别就是使用过滤返回的结果集不带评分操作,而使用Query返回的结果都是带相关性评分的,所以当我们如果有一些跟评分操作没有关系的业务,优先使用Filter操作,将会获取更好的性能,其实这也是Solr里面的q参数跟fq参数的区别.  下面,开始进入正题,在这之前,散仙还是喜欢老生常谈的先来了解一下Lucene里面有关

自定义过滤器

自定义过滤器有两种方法 $filterProvider.register('filterName',function(){ return function(obj){ var newObj =[]; angular.forEach(obj,function(o){ if(o.age>20) newObj.push(o); }) return newObj } }) 第二种 angular.module('myapp',[]).filter('filterName',function(){ ret

vue学习(二):自定义过滤器和自定义指令

#自定义指令 自定义指令的参数有: el: 指令所绑定的元素,可以用来直接操作 DOM . binding: 一个对象,包含以下属性: name: 指令名,不包括 v- 前缀. value: 指令的绑定值, 例如: v-my-directive="1 + 1", value 的值是 2. oldValue: 指令绑定的前一个值,仅在 update 和 componentUpdated 钩子中可用.无论值是否改变都可用. expression: 绑定值的字符串形式. 例如 v-my-di

phalcon模板引擎(volt)自定义过滤器

引子:今天遇到一个问题,模板中某些变量有时候没有定义,如果php开启了E_ALL报错级别,那么会出现一个notice,提示变量未定义. 一开始的想法是通过三元表达式( )来给每个变量设定一个默认值,后来发现这种写法太繁琐,而且与volt标签格格不入. 再后来想到屏蔽E_NOTICE报告,但开发环境下还是很不恰当的. 最后发现volt引擎有一个过滤器Filters功能,解决了这个问题,写法如:{{ var|default('str') }} ,在$var为空的时候,将会将该处设置为str,当然,s

Servlet学习笔记(八)—— 自定义过滤器的编写改进:自定义实现FilterChain

笔记六中实现了三种过滤器:字符编码过滤.登录权限过滤.敏感词过滤,但是有个缺陷就是,限定了过滤顺序,而不能实现先进行request过滤,最后response过滤,并且中间几项过滤的顺序不能动态改变.所以这里做个改进,实现一个过滤顺序的FilterChain. 多个Filter的执行顺序在这篇博文中得到很仔细的讲解,总结一点,多个过滤器的执行顺序是根据web.xml中不同<filter-mapping>的顺序来先后执行的,比如: <?xml version="1.0"

angularjs随笔01 数据双向绑定理解 自定义过滤器 时钟更新列子

1.   数据的双向绑定可以简单的理解为,无论在文本框中输入什么,都会在数据模型中显示出来输入的内容, 双向绑定的模型和数据是进行动态绑定的,实时检查进行修改. <input type="text" ng-model="name"> {{name}} 在上述代码中,通过angular.js将数据模型对象($scope)的name属性与文本模型绑定在一起,然后就实现了在输入框输入什么都会 在文本模型中显示对应的内容,实时更新. 控制器controller,

spring 集成shiro 之 自定义过滤器

出自:http://blog.csdn.net/shuishouhcd/article/details/9077379 最近一段时间,我一直在将shiro集成到我的一个项目中,用作认证和授权处理. shiro对我来说是个新东西,以下是我学习过的内容: http://shiro.apache.org/authorization.html http://www.cnblogs.com/skyme/archive/2011/09/11/2173760.html  系列 http://www.infoq

django之创建第6-1个项目-自定义过滤器

1.在站点blog目录下创建templatetags文件夹 2.templatetags目录下需要作为一个包来处理和调用其中的内容,需要有一个__init__.py文件 3.在templatetags目录下创建percent.py文件(里面定义过滤器) 4.编写percent.py文件,定义过滤器 # -*- coding: UTF-8 -*- #自定义过滤器,注意这里编码一定不要掉了,不然会报错啊~~~~ from django import template register = templ