【Vue】过滤器

13 篇文章 0 订阅

其实对过滤器这个名字,我是有疑问的,因为感觉项目中使用过滤器多数都是在格式化,而且本身根据Vue官方文档说明也是只能用于双花括号插值和 v-bind 表达式 (后者从 2.1.0+ 开始支持),这与语义不符感觉不如叫做格式化器。

废话不多说,本文主要讲的是Vue单页面应用程序中的私有过滤器以及全局过滤器的使用。两个程序都是以格式化时间作为案例。

私有过滤器:

定义含有两个参数的过滤器 timeFilter 第一个参数就是 | 管道前的值,第二个参数就是过滤器本身带有的参数("yyyy-MM-dd hh:mm:ss")。(ps:这里要注意一下一个参数,传入过滤器时已经不是Date类型,已经被转为string,这里有需要的可能要做特殊处理)

<template>
    <div>
      {{new Date()|timeFilter("yyyy-MM-dd hh:mm:ss")}}
    </div>
</template>

<script>
    export default {
        name: "Vue02",
        filters:{
            timeFilter(value,fmt){
                if(typeof(value)=='string'){
                    value=new Date(value);
                }
                var o = {
                    "M+" : value.getMonth()+1,                 //月份
                    "d+" : value.getDate(),                    //日
                    "h+" : value.getHours(),                   //小时
                    "m+" : value.getMinutes(),                 //分
                    "s+" : value.getSeconds(),                 //秒
                    "q+" : Math.floor((value.getMonth()+3)/3), //季度
                    "S"  : value.getMilliseconds()             //毫秒
                };
                if(/(y+)/.test(fmt))
                    fmt=fmt.replace(RegExp.$1, (value.getFullYear()+"").substr(4 - RegExp.$1.length));
                for(var k in o)
                    if(new RegExp("("+ k +")").test(fmt))
                        fmt = fmt.replace(RegExp.$1, (RegExp.$1.length==1) ? (o[k]) : (("00"+ o[k]).substr((""+ o[k]).length)));
                return fmt;
            }
        }
    }
</script>

多过滤器一起使用:

如果多过滤器一起使用,后面的过滤器接受到的就是前面过滤器处理后的值。

<template>
    <div>
      {{new Date()|timeFilter("yyyy-MM-dd hh:mm:ss")|testFilter}}
    </div>
</template>

<script>
    export default {
        name: "Vue02",
        filters:{
            timeFilter(value,fmt){
                if(typeof(value)=='string'){
                    value=new Date(value);
                }
                var o = {
                    "M+" : value.getMonth()+1,                 //月份
                    "d+" : value.getDate(),                    //日
                    "h+" : value.getHours(),                   //小时
                    "m+" : value.getMinutes(),                 //分
                    "s+" : value.getSeconds(),                 //秒
                    "q+" : Math.floor((value.getMonth()+3)/3), //季度
                    "S"  : value.getMilliseconds()             //毫秒
                };
                if(/(y+)/.test(fmt))
                    fmt=fmt.replace(RegExp.$1, (value.getFullYear()+"").substr(4 - RegExp.$1.length));
                for(var k in o)
                    if(new RegExp("("+ k +")").test(fmt))
                        fmt = fmt.replace(RegExp.$1, (RegExp.$1.length==1) ? (o[k]) : (("00"+ o[k]).substr((""+ o[k]).length)));
                return fmt;
            },
            testFilter(value){
                return value+"  测试";
            }
        }
    }
</script>

<style scoped>

</style>

全局过滤器:

先在src目录下简历filter文件夹,在filter文件夹下简历index.js文件。

/**
 * 全局过滤器
 */
const filters={
  /**
   * 时间过滤器
   * @param value 时间
   * @param fmt  格式 yyyy-MM-dd hh:mm:ss
   * @returns {*}
   */
  dateFormat:(value,fmt)=>{
    if(typeof(value)=='string'){
      value=new Date(value);
    }
    var o = {
      "M+" : value.getMonth()+1,                 //月份
      "d+" : value.getDate(),                    //日
      "h+" : value.getHours(),                   //小时
      "m+" : value.getMinutes(),                 //分
      "s+" : value.getSeconds(),                 //秒
      "q+" : Math.floor((value.getMonth()+3)/3), //季度
      "S"  : value.getMilliseconds()             //毫秒
    };
    if(/(y+)/.test(fmt))
      fmt=fmt.replace(RegExp.$1, (value.getFullYear()+"").substr(4 - RegExp.$1.length));
    for(var k in o)
      if(new RegExp("("+ k +")").test(fmt))
        fmt = fmt.replace(RegExp.$1, (RegExp.$1.length==1) ? (o[k]) : (("00"+ o[k]).substr((""+ o[k]).length)));
    return fmt;
  }
}
export default filters;

在main.js中加入全局声明中

// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue'
import App from './App'
import router from './router'
import filters from "./filter";

Vue.config.productionTip = false

for (let key in filters) {
  Vue.filter(key, filters[key]);
}

new Vue({
  el: '#app',
  router,
  components: { App },
  template: '<App/>'
})


在Vue文件中使用

<template>
    <div>
      {{new Date()|dateFormat("yyyy-MM-dd hh:mm:ss")}}
    </div>
</template>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值