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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!