vue中filter的用法

平时开发中,需要用到过滤器的地方有很多,比如单位转换、金额加千分位、文本格式化等,比如:

复制代码
 1 // 格式化金额
 2 const digitsRE = /(\d{3})(?=\d)/g
 3 Vue.filter('currencyFilter', function (value) {
 4 value = parseFloat(value)
 5     if (!isFinite(value) || (!value && value !== 0)) return ''
 6     currency = currency != null ? currency : '$'
 7     decimals = decimals != null ? decimals : 2
 8     var stringified = Math.abs(value).toFixed(decimals)
 9     var _int = decimals ? stringified.slice(0, -1 - decimals) : stringified
12     var i = _int.length % 3
13     var head = i > 0 ? (_int.slice(0, i) + (_int.length > 3 ? ',' : '')) : ''
16     var _float = decimals ? stringified.slice(-1 - decimals) : ''
19     var sign = value < 0 ? '-' : ''
20     return sign + currency + head + _int.slice(i).replace(digitsRE, '$1,') + _float    
23 })
复制代码

实现效果16568686.00=> 16,568,686.00

这是常规用法,没什么好说的。下面来说一下在开发中遇到的一个需要用到串联过滤器的使用场景。

假设需要获取一个订单处理状态的列表,其中的每一项的 status 字段用来表示订单状态:

1   {
2      id: '',
3      order_num: '123456789',
4      goodList: [ ... ],
5      address: { ... },
6      status: 1 // 1 待支付 2 待发货 3 待收货
7    }

当我们拿到这个数据之后,v-for 的时候,肯定会这样做:

复制代码
 1 <template>
 2     <!-- ... -->
 3     <span class="order_status_wrap">{{ orderItem.status | getOrderStatus }}</span>
 4     <!-- ... -->
 5 </template>
 6 <script>
 7   export default {
 8     // ...
 9     filters: {
10         getOrderStatus(status) {
11             switch (status.toString()) {
12                 case '1':
13                     return '待支付';
14                 case '2':
15                     return '待发货';
16                 case '3':
17                     return '待收货';
18                 default:
19                     return '';
20             }
21         }
22     }
23     // ...
24   }
25 </script>
26 <style scoped type="scss">
27     // ...
28     .order_status_wrap {
29         font-size: 14px;
30     }
31     // ...
32 </style>
复制代码

这样,表示状态的 1, 2, 3 就变成了 待支付,待发货,待收货,这没有什么问题。但是,当需求来了,要求当状态是待支付时,文字应该为红色。

vue文档中有写串联过滤器的用法,针对这个问题可以很好的解决。

复制代码
 1 <template>
 2     <!-- ... -->
 3     <span class="order_status" :class="orderItem.status | getOrderStatus | getOrderStatusClass">{{ orderItem.status | getOrderStatus }}</span>
 4     <!-- ... -->
 5 </template>
 6 <script>
 7   export default {
 8     // ...
 9     filters: {
10         getOrderStatus(status) {
11             switch (status.toString()) {
12                 case '1':
13                     return '待支付';
14                 case '2':
15                     return '待发货';
16                 case '3':
17                     return '待收货';
18                 default:
19                     return '';
20             }
21         },
22         getOrderStatusClass(status) {
23             if (status === '待支付') {
24                 return 'not-pay'
25             }
26             return ''
27         }
28     }
29     // ...
30   }
31 </script>
32 <style scoped type="scss">
33     // ...
34     .order_status {
35         font-size: 14px;
36         &.not-pay {
37             color: red;
38         }
39     }
40     // ...
41 </style>
复制代码

关于过滤器,这里还有几点要注意的:

  • 过滤器必须是个纯函数
  • 过滤器中拿不到 vue 实例,这是 vue 故意这么做的
  • 在全局注册过滤器是用 Vue.filter(),局部则是 filters: {}
  • 在方法中调用过滤器方法为: this.$http://options.filters.XXX

 

posted @   〆浮生如梦〆  阅读(876)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示