如何换个角度使用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 相关文章推荐
event.srcElement+表格应用
Aug 29 Javascript
jQuery 连续列表实现代码
Dec 21 Javascript
Javascript创建自定义对象 创建Object实例添加属性和方法
Jun 04 Javascript
jQuery实现鼠标悬停背景翻转的黑色导航菜单代码
Sep 14 Javascript
jQuery实现Tab菜单滚动切换的方法
Sep 21 Javascript
Javascript动画效果(3)
Oct 11 Javascript
jQuery Ajax File Upload实例源码
Dec 12 Javascript
纯js代码生成可搜索选择下拉列表的实例
Jan 11 Javascript
Vue表单类的父子组件数据传递示例
May 03 Javascript
vue axios 简单封装以及思考
Oct 09 Javascript
使用layui实现树形结构的方法
Sep 20 Javascript
vue Element左侧无限级菜单实现
Jun 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
《Re:从零开始的异世界生活 冰结之绊》
2020/04/09 日漫
PHP 实例化类的一点摘记
2008/03/23 PHP
thinkphp控制器调度使用示例
2014/02/24 PHP
PHP7.0版本备注
2015/07/23 PHP
Laravel5.1框架路由分组用法实例分析
2020/01/04 PHP
php封装的page分页类完整实例代码
2020/02/01 PHP
Web 前端设计模式--Dom重构 提高显示性能
2010/10/22 Javascript
jQuery EasyUI API 中文文档 - Tree树使用介绍
2011/11/19 Javascript
JS刷新框架外页面七种实现代码
2013/02/18 Javascript
javascript去掉前后空格的实例
2013/11/07 Javascript
javascript生成json数据简单示例分享
2014/02/14 Javascript
Jquery给基本控件的取值、赋值示例
2014/05/23 Javascript
最好用的Bootstrap fileinput.js文件上传组件
2016/12/12 Javascript
javascript添加前置0(补零)的几种方法
2017/01/05 Javascript
基于Nodejs利用socket.io实现多人聊天室
2017/02/22 NodeJs
Angular 4依赖注入学习教程之ClassProvider的使用(三)
2017/06/04 Javascript
vue.js select下拉框绑定和取值方法
2018/03/03 Javascript
JavaScript 跨域之POST实现方法
2018/05/07 Javascript
JS原生带缩略图的图片切换效果
2018/10/10 Javascript
vue实现移动端项目多行文本溢出省略
2020/07/29 Javascript
[46:21]Liquid vs LGD 2018国际邀请赛淘汰赛BO3 第一场 8.23
2018/08/24 DOTA
微信跳一跳python辅助软件思路及图像识别源码解析
2018/01/04 Python
Django自定义过滤器定义与用法示例
2018/03/22 Python
tensorflow -gpu安装方法(不用自己装cuda,cdnn)
2020/01/20 Python
Python调用Windows命令打印文件
2020/02/07 Python
一篇文章带你搞定Ubuntu中打开Pycharm总是卡顿崩溃
2020/11/02 Python
利用python+ffmpeg合并B站视频及格式转换的实例代码
2020/11/24 Python
中国最大的潮流商品购物网站:YOHO!BUY有货
2017/01/07 全球购物
印度最大的时尚购物网站:Myntra
2018/09/13 全球购物
RetroStage德国:复古服装
2019/02/03 全球购物
完美实现CSS垂直居中的11种方法
2021/03/27 HTML / CSS
优秀经理事迹材料
2014/02/01 职场文书
《秋游》教学反思
2014/04/24 职场文书
2014年青年志愿者工作总结
2014/12/09 职场文书
导游词之井冈山
2019/11/20 职场文书
详解JavaScript中Arguments对象用途
2021/08/30 Javascript