文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2024-12-11 21:23

关注

[[330672]]

定义和使用过滤器

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

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

全局过滤器

全局过滤器如下所示:

 

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

 

如上面的示例中看到的那样,本地过滤器作为“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. "app"
  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. "app"
  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. "app"
  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. "app"
  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. "app"
  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. "app"
  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. "app"
  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. "app"
  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. "app"
  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. "app"
  17.   {{ unpaidInvoices | without('#1003') }} 
  18.  
 

 

删除数组中重复的元素

 

  1. Vue.filter('unique'function (valuesunique) { 
  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. "app"
  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. "app"
  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. "app"
  16.   {{ greeting | repeat(3) }} 
  17.  
 

 

总结

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

来源:今日头条内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯