Vue.js学习之过滤器详解


Posted in Javascript onJanuary 22, 2017

前言

在这个教程中,我们将会通过几个例子,了解和学习VueJs的过滤器。阅读这这篇文中的前提是你对Vue已经有了基本的语法基础。

Vue.Js中的过滤器基础

过滤器是一个通过输入数据,能够及时对数据进行处理并返回一个数据结果的简单函数。Vue有很多很便利的过滤器,可以参考官方文档, http://cn.vuejs.org/api/#过滤器 ,过滤器通常会使用管道标志 “ | ”, 比如:

{{ msg | capitalize }}
// 'abc' => 'ABC'

uppercase过滤器 : 将输入的字符串转换成大写字母的过滤器。

VueJs允许你链式调用过滤器,简单的来说,就是一个过滤器的输出成为下一个过滤器的输入,然后再次过滤。接下来,我们可以想象一个比较简单的例子,使用了Vue的 filterBy + orderBy 过滤器来过滤所有商品products。过滤出来的产品是属于水果类商品。

filterBy过滤器 : 过滤器的值必须是一个数组,filterBy + 过滤条件。过滤条件是:'string || function'+ in 'optionKeyName'

orderBy过滤器 : 过滤器的值必须是一个数组,orderBy + 过滤条件。过滤条件是:'string || array ||function' + 'order ≥ 0 为升序 || order < 0 为降序'

接下来,我们可以看下下面这个例子:我们有一个商品数组products,我们希望遍历这个数组,并把他们打印成一张清单,这个用v-for很容易实现。

<ul class="product">
 <li v-for="product in products|filterBy '水果' in 'category' |orderBy 'price' 1">
 {{product.name}}-{{product.price | currency}}
 </li>
</ul>

上面的例子,就是用filterBy 过滤在 'category'中含有'水果' 关键字的列表,返回的列表就是只含有 '水果' 关键字的列表,而orderBy过滤器是根据价格做了一个升序,如果想要降序,只需要加一个小于0的参数;

自定义过滤器

虽然VueJs给我们提供了很多强有力的过滤器,但有时候还是不够。值得庆幸的,Vue给我们提供了一个干净简洁的方式来定义我们自己的过滤器,之后我们就可以利用管道 “ | ” 来完成过滤。

定义一个全局的自定义过滤器,需要使用Vue.filter()构造器。这个构造器需要两个参数。

Vue.filter() Constructor Parameters:

      1.filterId: 过滤器ID,用来做为你的过滤器的唯一标识;

      2.filter function: 过滤器函数,用一个function来接收一个参数,之后再将接收到的参数格式化为想要的数据结果。

上面的例子中,我们要实现商品价格打5折该怎么做呢?其实就是实现的一个自定义的过滤器,表示将商品的价格打了5折;而要实现它,需要完成的是:

      a、使用Vue.filter()构造器创建一个过滤器叫做discount

      b、输入商品的原价,能够返回其打五折之后的折扣价

代码见下面:

Vue.filter('discount', function(value) {
 return value * .5;
});
var product = new Vue({
 el: '.product',
 data: {
 products: [
  {name: '苹果',price: 25,category: "水果"}, 
  {name: '香蕉',price: 15,category: "水果"}, 
  {name: '雪梨',price: 65,category: "水果"}, 
  {name: '宝马',price: 2500,category: "汽车"},
  {name: '奔驰',price: 10025,category: "汽车"}, 
  {name: '柑橘',price: 15,category: "水果"}, 
  {name: '奥迪',price: 25,category: "汽车"}
 ]
 },
})

现在就可以像使用Vue自带的过滤器一样使用自定义过滤器了

<ul class="product">
 <li v-for="product in products|filterBy '水果' in 'category' |orderBy 'price' 0">
 {{product.name}}-{{product.price|discount | currency}}
 </li>
</ul>

上面代码实现的商品打5折,而如果要实现价格打任意折扣呢?应该在discount过滤器里增加一个折扣数值参数,改造一下我们的过滤器。

Vue.filter('discount', function(value, discount) {
 return value * (discount / 100);
});

然后重新调用我们的过滤器

<ul class="product">
 <li v-for="product in products|filterBy '水果' in 'category' |orderBy 'price' 0">
 {{product.name}}-{{product.price|discount 25 | currency}}
 </li>
</ul>

我们也可以在我们Vue实例里构造我们的过滤器,这样构造的好处是,这样就不会影响到其他不需要用到这个过滤器的Vue实例。

/*定义在全局 
Vue.filter('discount', function(value,discount) {
 return value * ( discount / 100 ) ;
});
*/
var product = new Vue({
 el: '.product',
 data: {
 products: [
  {name: '苹果',price: 25,category: "水果"}, 
  {name: '香蕉',price: 15,category: "水果"}, 
  {name: '雪梨',price: 65,category: "水果"}, 
  {name: '宝马',price: 2500,category: "汽车"},
  {name: '奔驰',price: 10025,category: "汽车"}, 
  {name: '柑橘',price: 15,category: "水果"}, 
  {name: '奥迪',price: 25,category: "汽车"}
 ]
 },
 //自定义在实例
 filters: {
 discount: function(value, discount) {
  return value * (discount / 100);
 }
 }
})

定义在全局就能在所有的实例中调用过滤器,如果定义在了实例里就在实例里调用过滤器。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家学习或者使用vue能带来一定的帮助,如果有疑问大家可以留言交流。

Javascript 相关文章推荐
基于jQuery的可以控制左右滚动及自动滚动效果的代码
Jul 25 Javascript
JavaScript中具名函数的多种调用方式总结
Nov 08 Javascript
jQuery实现精美的多级下拉菜单特效
Mar 14 Javascript
基于jQuery仿淘宝产品图片放大镜特效
Oct 19 Javascript
关于function类中定义变量this的简单说明
May 28 Javascript
JavaScript基础重点(必看)
Jul 09 Javascript
JS类的定义与使用方法深入探索
Nov 26 Javascript
angularjs实现搜索的关键字在正文中高亮出来
Jun 13 Javascript
浅谈Angular2 ng-content 指令在组件中嵌入内容
Aug 18 Javascript
Vue中使用 setTimeout() setInterval()函数的问题
Sep 13 Javascript
小程序实现左滑删除效果
Jul 25 Javascript
关于引入vue.js 文件的知识点总结
Jan 28 Javascript
Jquery与Bootstrap实现后台管理页面增删改查功能示例
Jan 22 #Javascript
Ionic 2 实现列表滑动删除按钮的方法
Jan 22 #Javascript
Vue.js学习之计算属性
Jan 22 #Javascript
ionic中列表项增加和删除的实现方法
Jan 22 #Javascript
JQueryEasyUI框架下的combobox的取值和绑定的方法
Jan 22 #Javascript
jQuery学习之DOM节点的插入方法总结
Jan 22 #Javascript
select下拉框插件jquery.editable-select详解
Jan 22 #Javascript
You might like
PHP实现MVC开发得最简单的方法――模型
2007/04/10 PHP
使用php+apc实现上传进度条且在IE7下不显示的问题解决方法
2013/04/25 PHP
Yii2实现增删改查后留在当前页的方法详解
2017/01/13 PHP
PHP实现找出有序数组中绝对值最小的数算法分析
2017/08/07 PHP
Laravel如何同时连接多个数据库详解
2019/08/13 PHP
javascript实现TreeView 无刷新展开的实例代码
2013/07/13 Javascript
js实现在字符串中提取数字
2013/11/05 Javascript
jquery等待效果示例
2014/05/01 Javascript
七个很有意思的PHP函数
2014/05/12 Javascript
微信支付 JS API支付接口详解
2016/07/11 Javascript
js 定义对象数组(结合)多维数组方法
2016/07/27 Javascript
一个可复用的vue分页组件
2017/05/15 Javascript
手动用webpack搭建第一个ReactApp的示例
2018/04/11 Javascript
vue自定义指令实现方法详解
2019/02/11 Javascript
JavaScript回调函数callback用法解析
2020/01/14 Javascript
python在windows命令行下输出彩色文字的方法
2015/03/19 Python
Python建立Map写Excel表实例解析
2018/01/17 Python
Python 使用指定的网卡发送HTTP请求的实例
2019/08/21 Python
在服务器上安装python3.8.2环境的教程详解
2020/04/26 Python
matplotlib基础绘图命令之errorbar的使用
2020/08/13 Python
M1芯片安装python3.9.1的实现
2021/02/02 Python
CSS3中媒体查询结合rem布局适配手机屏幕
2019/06/10 HTML / CSS
html5调用app分享功能示例(WebViewJavascriptBridge)
2018/03/21 HTML / CSS
阿里旅行:飞猪
2017/01/05 全球购物
印度领先的眼镜电子商务网站:Lenskart
2019/12/16 全球购物
计算机专业个人简短的自我评价
2013/10/23 职场文书
学习雷锋做美德少年寄语大全
2014/04/09 职场文书
绿色环保演讲稿
2014/05/10 职场文书
会计求职自荐信
2014/06/20 职场文书
学校运动会广播稿
2014/10/11 职场文书
公务员群众路线心得体会
2014/11/03 职场文书
工艺技术员岗位职责
2015/02/04 职场文书
银行先进个人总结
2015/02/15 职场文书
2016年校园社会综合治理宣传月活动总结
2016/03/16 职场文书
2019已经过半,你知道年中工作总结该怎么写吗?
2019/07/03 职场文书
Mysql 数据库中的 redo log 和 binlog 写入策略
2022/04/26 MySQL