通过事例讲解如果在Vue创建及使用过滤器

 与 AngularJS 类似,Vue.js 也有自己的数据转换和过滤方法,但是必须记住,过滤器并不改变原始数据,它们只改变输出并返回过滤后的数据。过滤器在很多不同的情况下都很有用,比如保持API响应尽可能干净,在前端处理数据的格式。希望通过将所有逻辑封装在可重用代码块之后来避免重复和连接的情况下,它们同样非常有效。

成都创新互联公司专注于清水河网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供清水河营销型网站建设,清水河网站制作、清水河网页设计、清水河网站官网定制、重庆小程序开发公司服务,打造清水河网络公司原创品牌,更为您提供清水河网站排名全网营销落地服务。

定义和使用过滤器

使用 Vue,我们可以通过两种不同的方式注册过滤器:全局和本地。前者方式可以访问所有组件中的过滤器,而后者则只能在定义该组件的组件内部使用过滤器。

过滤器是简单的 JS 函数,它们将要转换的值作为第一个参数,但是也可以传入尽可能多的其他参数来返回该值的格式化版本。

全局过滤器

全局过滤器如下所示:

 
 
 
  1. // 在此示例中,我们将注册一个全局过滤器用来在价格前面添加美元符号: 
  2.  
  3. // 声明 
  4. Vue.filter('toUSD', function (value)) { 
  5.   return `$${value}` 
  6. // 使用 
  7.  
  8.   {{ 351.99 | toUSD }} 
 

 

过滤器定义必须始终在主Vue实例之上,否则会得到一个Failed to resolve filter: toUSD错误。

 
 
 
  1. // DECLARATION 
  2. Vue.filter('toUSD', function (value) { 
  3.     return `$${value}`; 
  4. }); 
  5.  
  6. new Vue({ 
  7.     el: '#app', 
  8.  
  9.      data: { 
  10.         price: 351.99 
  11.     } 
  12. }); 
  13.  
  14. // USAGE 
  15.  
  16.   {{ price | toUSD }} 
 

 

本地过滤器

本地过滤器注册到一个Vue组件作用域中,来看看如何创建:

 
 
 
  1. // 在此示例中,我们将创建一个过滤器,将字符串变成大写。 
  2.  
  3. // 声明 
  4. new Vue({ 
  5.     el: '#app', 
  6.  
  7.     data: { 
  8.         name: 'scotch.io' 
  9.     }, 
  10.  
  11.     filters: { 
  12.        // Filter definitions 
  13.         Upper(value) { 
  14.             return value.toUpperCase(); 
  15.         } 
  16.     } 
  17. }); 
  18.  
  19. // 用法 
  20.  
  21.   {{ name | Upper }} 
 

 

如上面的示例中看到的那样,本地过滤器作为“filters”属性内的函数存储在Vue组件中。我们可以注册任意多个:

 
 
 
  1. ... 
  2.     filters: { 
  3.         Upper(value) { 
  4.               return value.toUpperCase(); 
  5.         }, 
  6.         Lower(value) { 
  7.             return value. toLowerCase(); 
  8.         }, 
  9.     } 
  10. .... 

附加参数设置

正如我们在本文引言中所提到的,过滤器可以根据需要接受任意多个参数

 
 
 
  1. // 声明 
  2. Vue.filter('readMore', function (text, length, suffix) { 
  3.     return text.substring(0, length) + suffix; 
  4. }); 
  5.  
  6. new Vue({ 
  7.     el: '#app', 
  8.  
  9.     data: { 
  10.         text: 'Lorem ipsum dolor sit amet, consectetur adipisicing elit. Non ab modi repellendus labore facere, fugiat ipsam quae accusantium commodi voluptas nesciunt dolor similique ipsum accusamus earum eligendi suscipit laborum quod.' 
  11.     } 
  12. }); 
  13.  
  14. // 用法 
  15.  
  16.   {{ text | readMore(10, '...') }} 
  17.  

 

在此示例中,我们创建了一个名称为“readMore”的过滤器,该过滤器会将字符串的长度限制为给定的字符数,并且还会在其中添加所选择的后缀。Vue.js 将要过滤的值作为第一个参数 text 传递,length 和 suffix 作为第二个和第三个参数传递。

链式过滤器

关于过滤器,我最喜欢的一点是能够使用管道(|)符号将它们链接起来,并通过一系列转换器运行单个值。再举一个价格的例子,我们想限制价格的小数位以及加价格的单位。

 
 
 
  1. // JS 
  2. Vue.filter('toFixed', function (price, limit) { 
  3.     return price.toFixed(limit); 
  4. }); 
  5.  
  6. Vue.filter('toUSD', function (price) { 
  7.     return `$${price}`; 
  8. }); 
  9.  
  10. new Vue({ 
  11.     el: '#app', 
  12.  
  13.     data: { 
  14.         price: 435.333 
  15.     } 
  16. }); 
  17.  
  18. // HTML 
  19.  
  20.  
  21.   {{ price | toFixed(2) | toUSD }} 
  22.  

 

示例

接下来,我们通过一些事例来巩固一下。

将 JS 值转换为JSON字符串

 
 
 
  1. // JS 
  2. Vue.filter('json', function (value) { 
  3.     return JSON.stringify(value); 
  4. }); 
  5.  
  6. new Vue({ 
  7.     el: '#app', 
  8.  
  9.     data: { 
  10.         user: { 
  11.             username: 'johndoe', 
  12.             email: 'john@example.com', 
  13.             countryCode: 'U.K.' 
  14.         } 
  15.     } 
  16. }); 
  17.  
  18.  
  19. // HTML 
  20.  
  21.   {{ user | json }} 
  22.  

 

从对象数组中提取属性值列表

 
 
 
  1. Vue.filter('pluck', function (objects, key) { 
  2.     return objects.map(function(object) {  
  3.         return object[key]; 
  4.     }); 
  5. }); 
  6.  
  7. new Vue({ 
  8.     el: '#app', 
  9.  
  10.     data: { 
  11.         users: [ 
  12.         { 
  13.             "id": 4, 
  14.             "first_name": "Eve", 
  15.             "last_name": "Holt" 
  16.         }, 
  17.         { 
  18.             "id": 5, 
  19.             "first_name": "Charles", 
  20.             "last_name": "Morris" 
  21.         }, 
  22.         { 
  23.             "id": 6, 
  24.             "first_name": "Tracey", 
  25.             "last_name": "Ramos" 
  26.         } 
  27.         ] 
  28.     } 
  29. }); 
  30.  
  31.  
  32. // HTML 
  33.  
  34.  
  35.   {{ users | pluck('last_name') }} 
  36.  

 

返回给定索引处的元素

 
 
 
  1. Vue.filter('at', function (value, index) { 
  2.     return value[index]; 
  3. }); 
  4.  
  5. new Vue({ 
  6.     el: '#app', 
  7.  
  8.     data: { 
  9.         videos: ['Zi_XLOBDo_Y', 'sOnqjkJTMaA', 'sOnqjkJTMaA'] 
  10.     } 
  11. }); 
  12.  
  13. // HTML 
  14.  
  15.   {{ videos | at(1) }} 
  16.  

 

返回给定列表中的最小值

 
 
 
  1. // JS 
  2. Vue.filter('min', function (values) { 
  3.     return Math.min(...values); 
  4. }); 
  5.  
  6. new Vue({ 
  7.     el: '#app', 
  8.  
  9.     data: { 
  10.         ages: [23, 19, 45, 12, 32] 
  11.     } 
  12. }); 
  13.  
  14. // HTML 
  15.  
  16.  
  17.   {{ ages | min }} 
  18.  

 

随机排列元素列表:

 
 
 
  1. Vue.filter('shuffle', function (values) { 
  2.     for (var i = values.length - 1; i > 0; i--) { 
  3.         var j = Math.floor(Math.random() * (i + 1)); 
  4.         var temp = values[i]; 
  5.         values[i] = values[j]; 
  6.         values[j] = temp; 
  7.     } 
  8.     return values; 
  9. }); 
  10.  
  11. new Vue({ 
  12.     el: '#app', 
  13.  
  14.     data: { 
  15.         cards: ['Lahire', 'Judith', 'Lancelot', 'Alexandre'] 
  16.     } 
  17. }); 
  18.  
  19. // HTML 
  20.  
  21.  
  22.   {{ cards | shuffle }} 
  23.  

 

返回数组的第一个元素:

 
 
 
  1. Vue.filter('first', function (values) { 
  2.     if(Array.isArray(values)) { 
  3.         return values[0]; 
  4.     } 
  5.     return values; 
  6. }); 
  7.  
  8. new Vue({ 
  9.     el: '#app', 
  10.  
  11.     data: { 
  12.         consoles: ['PlayStation', 'Nintendo DS', 'Xbox', 'Atari'] 
  13.     } 
  14. }); 
  15.  
  16. // HTML 
  17.  
  18.   {{ consoles | first }} 
  19.  

 

返回数组的最后一个元素

 
 
 
  1. Vue.filter('last', function (values) { 
  2.     if(Array.isArray(values)) { 
  3.         return values[values.length - 1]; 
  4.     } 
  5.     return values; 
  6. }); 
  7.  
  8. new Vue({ 
  9.     el: '#app', 
  10.  
  11.     data: { 
  12.         consoles: ['PlayStation', 'Nintendo DS', 'Xbox', 'Atari'] 
  13.     } 
  14. }); 
  15.  
  16. // HTML 
  17.  
  18.   {{ consoles | last }} 
  19.  

 

返回过滤指定元素的数组的副本

 
 
 
  1. Vue.filter('without', function (values, exclude) { 
  2.     return values.filter(function(element) { 
  3.         return !exclude.includes(element); 
  4.     }); 
  5. }); 
  6.  
  7. new Vue({ 
  8.     el: '#app', 
  9.  
  10.     data: { 
  11.         unpaidInvoices: ['#1001', '#1002', '#1003', '#1004'] 
  12.     } 
  13. }); 
  14.  
  15. // HTML 
  16.  
  17.   {{ unpaidInvoices | without('#1003') }} 
  18.  

 

删除数组中重复的元素

 
 
 
  1. Vue.filter('unique', function (values, unique) { 
  2.     return values.filter(function(element, index, self) { 
  3.         return index == self.indexOf(element); 
  4.     }); 
  5. }); 
  6.  
  7. new Vue({ 
  8.     el: '#app', 
  9.  
  10.     data: { 
  11.         recentViewedPosts: [13, 43, 23, 13, 43, 3, 98, 42, 65] 
  12.     } 
  13. }); 
  14.  
  15. // HTML 
  16.  
  17.  
  18.   {{ recentViewedPosts | unique }} 
  19.  

 

在字符串后加上文本

 
 
 
  1. Vue.filter('prepend', function (string, prepend) { 
  2.     return `${string}${prepend}`; 
  3. }); 
  4.  
  5. new Vue({ 
  6.     el: '#app', 
  7.  
  8.     data: { 
  9.         greeting: 'Hello' 
  10.     } 
  11. }); 
  12.  
  13. // HTML 
  14.  
  15.   {{ greeting | prepend(' World!') }} 
  16.  

 

重复一个字符串n次

 
 
 
  1. Vue.filter('repeat', function (string, times) { 
  2.     return string.repeat(times); 
  3. }); 
  4.  
  5. new Vue({ 
  6.     el: '#app', 
  7.  
  8.     data: { 
  9.         greeting: 'Hello' 
  10.     } 
  11. }); 
  12.  
  13. // HTML 
  14.  
  15.  
  16.   {{ greeting | repeat(3) }} 
  17.  

 

总结

希望读者们从这篇文章中能学到了一些东西,现在知道如何创建和使用过滤器,最重要的是,你现在可以重构你的代码,用过滤器来清理它。

网站标题:通过事例讲解如果在Vue创建及使用过滤器
标题网址:http://www.stwzsj.com/qtweb/news4/11404.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

猜你还喜欢下面的内容

服务器托管知识

各行业网站