VUE2- 重温全局过滤器《Vue 2 -- 全局过滤器》Vue 中的全局过滤器是一个非常强大的工具,它可以对数据进行格
前言
在 Vue 开发中,全局过滤器是一个强大而实用的工具,它能够对数据进行格式化和处理,为前端开发带来极大的便利。本文将深入探讨 Vue 中的全局过滤器的作用、用法以及一些巧妙的应用场景。
一、全局过滤器的作用
- 数据格式化
- 日期格式化:在前端开发中,经常需要将日期格式化为特定的字符串形式。例如,将时间戳转换为 “年 - 月 - 日 时:分: 秒” 的格式。通过全局过滤器,可以轻松实现这样的日期格式化操作,使得页面上显示的日期更加清晰易读。
- 货币格式化:当处理货币数据时,全局过滤器可以将数字格式化为货币格式,如添加货币符号、千位分隔符等。这样可以提高数据的可读性,并且在不同地区的用户面前呈现出合适的货币表示形式。
- 文本格式化:可以对文本进行各种格式化操作,如首字母大写、去除首尾空格、截断过长的文本等。这些格式化操作可以使页面上的文本更加规范和美观。
- 数据过滤
- 筛选数据:全局过滤器可以根据特定的条件对数据进行筛选。例如,可以过滤出数组中满足特定条件的元素,或者对对象的属性进行筛选。这样可以在不修改原始数据的情况下,根据不同的需求展示不同的数据子集。
- 数据转换:有时候需要将一种数据类型转换为另一种数据类型。全局过滤器可以实现这样的转换,例如将字符串转换为数字、将布尔值转换为字符串等。这在处理不同数据源的数据时非常有用。
- 提高代码复用性
- 全局过滤器可以在整个 Vue 应用中复用。一旦定义了一个全局过滤器,就可以在多个组件中使用它,无需在每个组件中重复编写相同的格式化或过滤逻辑。这大大提高了代码的复用性,减少了代码的冗余。
二、全局过滤器的用法
-
定义全局过滤器
-
在 Vue 实例化之前,可以使用 Vue.filter () 方法来定义全局过滤器。以下是一个定义全局过滤器的示例:
Vue.filter('dateFormat', function(value) { if (!value) return ''; const date = new Date(value); const year = date.getFullYear(); const month = ('0' + (date.getMonth() + 1)).slice(-2); const day = ('0' + date.getDate()).slice(-2); const hours = ('0' + date.getHours()).slice(-2); const minutes = ('0' + date.getMinutes()).slice(-2); const seconds = ('0' + date.getSeconds()).slice(-2); return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`; });
-
在上面的示例中,定义了一个名为 “dateFormat” 的全局过滤器,它接受一个时间戳作为参数,并将其格式化为 “年 - 月 - 日 时:分: 秒” 的字符串形式。
-
-
在模板中使用全局过滤器
-
定义好全局过滤器后,可以在 Vue 的模板中使用它。在模板中,可以通过管道符 “|” 将过滤器应用于数据。以下是一个在模板中使用全局过滤器的示例:
<template> <div> <p>当前时间:{{ currentTime | dateFormat }}</p> </div> </template> <script> export default { data() { return { currentTime: new Date().getTime(), }; }, }; </script>
-
在上面的示例中,在模板中使用了 “dateFormat” 过滤器来格式化当前时间的时间戳。
-
-
传递参数给全局过滤器
-
全局过滤器还可以接受参数。在模板中,可以在过滤器后面添加参数,以传递给过滤器函数。以下是一个接受参数的全局过滤器的示例:
Vue.filter('currencyFormat', function(value, currencySymbol) { if (!value) return ''; return `${currencySymbol}${value.toFixed(2)}`; });
<template> <div> <p>金额:{{ amount | currencyFormat('$') }}</p> </div> </template> <script> export default { data() { return { amount: 1234.56, }; }, }; </script>
- 在上面的示例中,定义了一个名为 “currencyFormat” 的全局过滤器,它接受两个参数:一个是要格式化的数字,另一个是货币符号。在模板中,使用了这个过滤器,并传递了 “$” 作为货币符号。
-
三、全局过滤器的妙用
-
动态过滤数据
-
全局过滤器可以根据不同的条件动态地过滤数据。例如,可以根据用户的选择或输入来动态地应用不同的过滤器。以下是一个动态过滤数据的示例:
-
<template> <div> <select v-model="filterType"> <option value="all">全部</option> <option value="active">已激活</option> <option value="inactive">未激活</option> </select> <ul> <li v-for="user in users" :key="user.id"> <span>{{ user.name }}</span> <span>{{ user.status | filterByStatus(filterType) }}</span> </li> </ul> </div> </template> <script> Vue.filter('filterByStatus', function(status, filterType) { if (filterType === 'all') return status; if (filterType === 'active' && status === 'active') return status; if (filterType === 'inactive' && status === 'inactive') return status; return ''; }); export default { data() { return { filterType: 'all', users: [ { id: 1, name: '张三', status: 'active' }, { id: 2, name: '李四', status: 'inactive' }, { id: 3, name: '王五', status: 'active' }, ], }; }, }; </script>
-
在上面的示例中,定义了一个名为 “filterByStatus” 的全局过滤器,它接受两个参数:一个是用户的状态,另一个是过滤类型。在模板中,使用了这个过滤器,并根据用户选择的过滤类型动态地过滤用户列表中的状态。
-
-
链式调用过滤器
-
全局过滤器可以链式调用,即一个过滤器的输出可以作为另一个过滤器的输入。这样可以实现更复杂的数据格式化和过滤操作。以下是一个链式调用过滤器的示例:
-
<template> <div> <p>{{ text | trim | capitalize }}</p> </div> </template> <script> Vue.filter('trim', function(value) { if (!value) return ''; return value.trim(); }); Vue.filter('capitalize', function(value) { if (!value) return ''; return value.charAt(0).toUpperCase() + value.slice(1); }); export default { data() { return { text: ' hello world! ', }; }, }; </script>
-
在上面的示例中,定义了两个全局过滤器:“trim” 和 “capitalize”。在模板中,使用了这两个过滤器的链式调用,先去除文本的首尾空格,然后将首字母大写。
-
-
自定义过滤器实现复杂逻辑
-
全局过滤器可以实现复杂的逻辑,例如对数组进行排序、过滤和映射等操作。以下是一个实现复杂逻辑的全局过滤器的示例:
-
Vue.filter('arrayTransform', function(array, options) { if (!array ||!Array.isArray(array)) return []; let filteredArray = array; if (options.filter) { filteredArray = filteredArray.filter(item => options.filter(item)); } if (options.sortBy) { filteredArray.sort((a, b) => { const valueA = a[options.sortBy]; const valueB = b[options.sortBy]; if (valueA < valueB) return -1; if (valueA > valueB) return 1; return 0; }); } if (options.map) { filteredArray = filteredArray.map(item => options.map(item)); } return filteredArray; });
-
<template> <div> <ul> <li v-for="item in items | arrayTransform({ filter: item => item.price > 100, sortBy: 'price', map: item => ({ name: item.name, price: `$${item.price}` }) })"> <span>{{ item.name }}</span> <span>{{ item.price }}</span> </li> </ul> </div> </template> <script> export default { data() { return { items: [ { name: '商品 1', price: 50 }, { name: '商品 2', price: 120 }, { name: '商品 3', price: 80 }, { name: '商品 4', price: 150 }, ], }; }, }; </script>
-
在上面的示例中,定义了一个名为 “arrayTransform” 的全局过滤器,它接受一个数组和一个选项对象作为参数。选项对象可以包含过滤、排序和映射等操作的配置。在模板中,使用了这个过滤器对一个商品数组进行过滤、排序和映射操作,只显示价格大于 100 的商品,并将价格格式化为货币形式。
-
四、总结
Vue 中的全局过滤器是一个非常强大的工具,它可以对数据进行格式化、过滤和转换等操作,提高代码的复用性和可读性。通过定义全局过滤器,可以在整个 Vue 应用中轻松地实现数据的格式化和处理,而无需在每个组件中重复编写相同的逻辑。在实际开发中,可以根据具体的需求灵活地使用全局过滤器,实现各种巧妙的应用场景,提高开发效率和用户体验。
转载自:https://juejin.cn/post/7406143548918251570