记念即将逝去的Vue过滤器

pic

在这个教程中,咱们将会经过几个例子,了解和学习VueJs的过滤器。咱们参考了一些比较完善的过滤器,好比orderBy 和 filterBy。并且咱们能够链式调用过滤器,一个接一个过滤。所以,咱们能够定义咱们本身的过滤器在咱们的Vue实例中。html

阅读这个教程的前提是你对Vue已经有了基本的语法基础。前端

VueJs中的过滤器基础

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

{{ msg | uppercase  }}

  // 'abc' => 'ABC'

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

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

链式过滤

VueJs容许你链式调用过滤器,简单的来讲,就是一个过滤器的输出成为下一个过滤器的输入,而后再次过滤。接下来,咱们能够想象一个比较简答的例子,使用了Vue的 filterBy + orderBy 过滤器来过滤全部商品products。过滤出来的产品是属于电器类商品,而且按电器字母排序。json

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

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

接下来,咱们能够看下第二个例子:
咱们有一个商品数组products,咱们但愿遍历这个数组,并把他们打印成一张清单,这个用v-for很容易实现。electron

<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引发来前端一波热烈的讨论。从尤大的github上看到了2.0和1.0的区别

Vue2.0想要把filter去掉。不过我想,若是是用1.0的朋友仍是很须要用到过滤器的 : )

github地址
https://github.com/AppianZ/Close2Vue

相关文章
相关标签/搜索