如何换个角度使用VUE过滤器详解


Posted in Javascript onSeptember 11, 2019

前言

过滤器在Vue中的主要用于文本格式化,如小写转大小,日期格式化等操作。官方对这个功能介绍也很简单,不过确实很简单,就一个函数而已。但最近在做两款APP时,遇到一些特殊的需求。然后就对vue中的filter一些用法结合源码好好的梳理了下。下边我们以一个日期格式化展开讨论。

1. 定义一个日期格式化函数

都9012了,我们就采用 ES Module的写法,在vue初始化的项目src的文件中新建一个filters文件夹,并在其中添加DateFmt.js文件,代码如下

export function DateFmt(date, fmt) {
if (date == null) return null;
var o = {
  "M+": date.getMonth() + 1, // 月份
  "d+": date.getDate(), // 日
  "h+": date.getHours(), // 小时
  "m+": date.getMinutes(), // 分
  "s+": date.getSeconds(), // 秒
  "q+": Math.floor((date.getMonth() + 3) / 3), // 季度
  "S": date.getMilliseconds()
};
if (/(y+)/.test(fmt))
  fmt = fmt.replace(RegExp.$1, (date.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;
}

2. 使用过滤器 DateFmt

定义好函数后,我们采用全局注册filter的方式。在main.js中使用import { DateFmt } from '@/filters/DateFmt.js' 导入我们上边定义的函数。 使用Vue.filter("DateFmt", DateFmt) 完成filter全局注册。

在components文件夹中,添加我们的测试组件DateFormat.vue,在该文件template>div节点下输入{{new Date()|DateFmt('yyyy-MM-dd hh:mm:ss')}} 然后在app.vue引入我们刚新添加的组件,运行,你就会在看到当前日期已经按照我们需要的格式显示在网页上。是的,就是这么简单,那完了么?

3. 在JS中使用 DateFmt

好奇的朋友会发现,我们定义的filter都是在template中使用的,那我如何在js代码中使用呢?当然,在开发这两个app期间,减少数据转换的次数,有了这样的需求。

3.1 在组件页面导入函数

回到开头,我们强调了一下,过滤器其实就是一个函数。既然是函数,那引入就好了。所以在我们最初建立 DateFormat.vue 单文件组件的<script>块中使用import { DateFmt } from '@/filters/DateFmt.js'导入我们的函数。代码如下:

<script>
import { DateFmt } from '@/filters/DateFmt.js';
export default {
data(){
return{
curDateImportFilter: DateFmt(new Date(), 'yyyy-MM-dd hh:mm:ss')
}}}
</script>

在我们<template>中新加一个元素,并绑定 curDateImportFilter属性,运行 npm run serve 回到浏览器,你就会看到两个格式化日期。这样好吗?我们多了一个import , 虽然实现了,但觉得不够好。

3.2 使用Vue.filter 返回过滤器

如果我们仔细看官方文档,就会发现官说明了,通过 Vue.filter("filter")返回定义的函数 ,所以Vue.filter不仅可以注册,还可以返回。

我们继续在data中添加属性 :

curDateVueFilter: Vue.filter("DateFmt")(new Date(), 'yyyy-MM-dd hh:mm:ss')

通过上边的步骤绑定该属性,你会在浏览器上看到三个格式化好的日期。要使用Vue.filter,我们不得不额外的导入import Vue from 'vue'。跟上边一样,虽然实现了,但不够好。

3.3 使用实例属性$options

在vue组件,每个组件都有各自的属性,这些属性大多挂载中属性 $options中,在chrome浏览器打印$vm0信息,我们就找到filter的信息。这里科普一下,在安装vue开发者工具后$vm0表示我们当前选择的组件,结果如下图所示:

如何换个角度使用VUE过滤器详解

从图形上看,当前组件的filters为一个对象,并不能直接找到,不过展开至__proto__原型上看到了我们的DateFmt方法。好了现在我们在继续在data中添加属性

curDateOptFilter: this.$options.filters.DateFmt(new Date(), 'yyyy-MM-dd hh:mm:ss')

是的,采用这个方式,就不用再引入vue或者函数了,跟直接在template使用一样。简洁方便,感觉好多了。在深入一点,通过调试我们就会发现 Vue.filter 是调用options.filters原型上的方法,如下图所示

如何换个角度使用VUE过滤器详解

4. 总结

再简单的功能,也有你想不到的用法。做开发,还是要会发散。本来这篇文章还想分享一下 vue 中scope css穿透功能。为了方便阅读,就且听下回分解吧。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
JavaScript的面向对象(一)
Nov 09 Javascript
Cookie 注入是怎样产生的
Apr 08 Javascript
Javascript 类与静态类的实现(续)
Apr 02 Javascript
jQuery侧边栏随窗口滚动实现方法
Mar 04 Javascript
js转义字符介绍
Nov 05 Javascript
jquery ajax 简单范例(界面+后台)
Nov 19 Javascript
AngularJS 让人爱不释手的八种功能
Mar 23 Javascript
利用jQuery实现一个简单的表格上下翻页效果
Mar 14 Javascript
js实现登录注册框手机号和验证码校验(前端部分)
Sep 28 Javascript
图文详解vue框架安装步骤
Feb 12 Javascript
Javascript数组方法reduce的妙用之处分享
Jun 10 Javascript
layer弹出层自定义提交取消按钮的例子
Sep 10 Javascript
基于jquery ajax的多文件上传进度条过程解析
Sep 11 #jQuery
js实现图片区域可点击大小随意改变(适用移动端)代码实例
Sep 11 #Javascript
解析vue、angular深度作用选择器
Sep 11 #Javascript
javascript 构建模块化开发过程解析
Sep 11 #Javascript
解决layer弹出层msg的文字不显示的问题
Sep 11 #Javascript
js贪心算法 钱币找零问题代码实例
Sep 11 #Javascript
解决layui使用layui-icon出现默认图标的问题
Sep 11 #Javascript
You might like
apache2.2.4+mysql5.0.77+php5.2.8安装精简
2009/04/29 PHP
php学习之简单计算器实现代码
2011/06/09 PHP
浅析php中常量,变量的作用域和生存周期
2013/08/10 PHP
php 获取SWF动画截图示例代码
2014/02/10 PHP
PHP抽奖算法程序代码分享
2015/10/08 PHP
Yii2-GridView 中让关联字段带搜索和排序功能示例
2017/01/21 PHP
BOOM vs RR BO5 第三场 2.14
2021/03/10 DOTA
读jQuery之三(构建选择器)
2011/06/11 Javascript
开发 Internet Explorer 右键功能表(ContextMenu)
2013/07/03 Javascript
JavaScript中的setMilliseconds()方法使用详解
2015/06/11 Javascript
AngularJS压缩JS技巧分析
2016/11/08 Javascript
js 中文汉字转Unicode、Unicode转中文汉字、ASCII转换Unicode、Unicode转换ASCII、中文转换
2016/12/06 Javascript
详解JS对象封装的常用方式
2016/12/30 Javascript
JS实现本地存储信息的方法(基于localStorage与userData)
2017/02/18 Javascript
Web纯前端“旭日图”实现元素周期表
2017/03/10 Javascript
Angular+Bootstrap+Spring Boot实现分页功能实例代码
2017/07/21 Javascript
JS图片延迟加载插件LazyImgv1.0用法分析【附demo源码下载】
2017/09/04 Javascript
微信小程序带动画弹窗组件使用方法详解
2018/11/27 Javascript
JavaScript实现获取两个排序数组的中位数算法示例
2019/02/26 Javascript
Nodejs核心模块之net和http的使用详解
2019/04/02 NodeJs
详细讲解如何创建, 发布自己的 Vue UI 组件库
2019/05/29 Javascript
Weex开发之WEEX-EROS开发踩坑(小结)
2019/10/16 Javascript
Tensorflow 利用tf.contrib.learn建立输入函数的方法
2018/02/08 Python
Python字符串、整数、和浮点型数相互转换实例
2018/08/04 Python
Python3.6.x中内置函数总结及讲解
2019/02/22 Python
python递归法解决棋盘分割问题
2019/07/17 Python
pytorch 实现打印模型的参数值
2019/12/30 Python
使用wxpy实现自动发送微信消息功能
2020/02/28 Python
Windows下Anaconda和PyCharm的安装与使用详解
2020/04/23 Python
如何理解python对象
2020/06/21 Python
阿玛尼美妆加拿大官方商城:Giorgio Armani Beauty加拿大
2017/10/24 全球购物
Camille Jewelry官网:现代女性时尚首饰
2019/07/07 全球购物
大学本科毕业生求职简历的自我评价
2013/10/09 职场文书
奥巴马就职演讲稿
2014/05/15 职场文书
2016年全国爱眼日宣传教育活动总结
2016/04/05 职场文书
Win10多屏显示如何设置?Win10电脑多屏显示设置操作方法
2022/07/07 数码科技