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更换文章内容与改变字体大小代码
Sep 30 Javascript
js中call与apply的用法小结
Dec 28 Javascript
javascript使用call调用微信API
Dec 15 Javascript
javascript实现网站加入收藏功能
Dec 16 Javascript
利用AngularJs实现京东首页轮播图效果
Sep 08 Javascript
JavaScript定义数组的三种方法(new Array(),new Array('x','y')
Oct 04 Javascript
使用jquery给指定的table动态添加一行、删除一行
Oct 13 Javascript
浅谈Vue响应式(数组变异方法)
May 07 Javascript
vue项目中使用lib-flexible解决移动端适配的问题解决
Aug 23 Javascript
vue实现表单录入小案例
Sep 27 Javascript
vue.js实现左边导航切换右边内容
Oct 21 Javascript
微信小程序中的上拉、下拉菜单功能
Mar 13 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生成树的方法
2015/07/28 PHP
thinkphp利用模型通用数据编辑添加和删除的实例代码
2016/11/20 PHP
php实现XML和数组的相互转化功能示例
2017/02/08 PHP
thinkPHP+ajax实现统计页面pv浏览量的方法
2017/03/15 PHP
JQuery 表单中textarea字数限制实现代码
2009/12/07 Javascript
Jquery插件之打造自定义的select标签
2011/11/30 Javascript
onmouseover和onmouseout的一些问题思考
2013/08/14 Javascript
Java/JS获取flash高宽的具体方法
2013/12/27 Javascript
javascript在IE下trim函数无法使用的解决方法
2014/09/12 Javascript
JS+CSS实现自动改变切换方向图片幻灯切换效果的方法
2015/03/02 Javascript
JavaScript实现简单图片翻转的方法
2015/04/17 Javascript
举例详解Python中smtplib模块处理电子邮件的使用
2015/06/24 Javascript
详解iframe与frame的区别
2016/01/13 Javascript
jQuery获取字符串中出现最多的数
2016/02/22 Javascript
原生js仿jquery实现对Ajax的封装
2016/10/04 Javascript
Jil,高效的json序列化和反序列化库
2017/02/15 Javascript
JavaScript实现的商品抢购倒计时功能示例
2017/04/17 Javascript
详解nodejs实现本地上传图片并预览功能(express4.0+)
2017/06/28 NodeJs
React Native react-navigation 导航使用详解
2017/12/01 Javascript
利用Javascript开发一个二维周视图日历
2017/12/14 Javascript
基于vue1和vue2获取dom元素的方法
2018/03/17 Javascript
vue 监听屏幕高度的实例
2018/09/05 Javascript
js使用cookie实现记住用户名功能示例
2019/06/13 Javascript
Vue computed 计算属性代码实例
2020/04/22 Javascript
vue+springboot+element+vue-resource实现文件上传教程
2020/10/21 Javascript
Javascript表单序列化原理及实现代码详解
2020/10/30 Javascript
[02:53]DOTA2亚洲邀请赛 NewBee战队巡礼
2015/02/03 DOTA
Python最基本的输入输出详解
2015/04/25 Python
python实现实时监控文件的方法
2016/08/26 Python
对numpy中数组转置的求解以及向量内积计算方法
2018/10/31 Python
Python装饰器简单用法实例小结
2018/12/03 Python
代码实例讲解python3的编码问题
2019/07/08 Python
关于爱国的标语
2014/06/24 职场文书
竞选班干部演讲稿600字
2014/08/20 职场文书
如何创建一个创建MySQL数据库中的datetime类型
2022/03/21 MySQL
Alexa停服!网站排名将何去何从?目前还没有替代品。
2022/04/15 杂记