el-date-picker 自定义指令,输入数字自动转换显示yyyy-mm-dd格式

el-date-picker 自定义指令,输入数字显示yyyy-mm-dd格式

  • 在main.js引入自定义指令direct.js
  • direct.js
    • 公共部分
    • 时间日期控件,表格内编辑时间控件可用 - (年-月-日)
    • 时间范围控件 - (年-月-日)
    • 日期转换主要正则
      • 年-月-日/年-月-日 时:分/年-月-日 时:分:秒
      • 年-月
      • 年-月-01/年-01-01
    • 时间日期选择器 - (年-月-日)


在main.js引入自定义指令direct.js

import '@/components/common/js/direct.js'

direct.js

公共部分

注:自定义指令传值时,binding.value是接收值

import Vue from 'vue'
// import $ from 'jquery'; // 在需要使用的页面中// 日期转换正则
const convertYMDRegExp = function (value) {// 判断输入的时间为几位数,正则匹配相应的事件格式。可直接采用moment转换,更直接。value = value.replace(/[^0-9]/g, '')if (value.length > 5 && value.length < 9) {value = value.replace(/^(\d{4})\D*(\d{1,2})\D*(\d{1,2})\D*/, '$1-$2-$3') // 格式化输入格式,2021-03-01} else if (value.length > 9 && value.length < 13) {value = value.replace(/^(\d{4})\D*(\d{1,2})\D*(\d{1,2})\D*(\d{1,2})\D*(\d{1,2})\D*/, '$1-$2-$3 $4:$5') // 格式化输入格式,2021-03-01 09:50} else if (value.length > 12) {value = value.replace(/^(\d{4})\D*(\d{1,2})\D*(\d{1,2})\D*(\d{1,2})\D*(\d{1,2})\D*(\d{1,2})\D*/, '$1-$2-$3 $4:$5:$6') // 格式化输入格式,2020-03-01 09:50:30} else {return ''}value = supplement(value)const time = value && value.constructor == String ? value : ''  // 转换时间格式return time
}// 补0
// 使用$&匹配
function supplement(str) {// replace第一个参数正则// (?<=\/|-|\.|:|\b)\d{1}  用的是后顾,查找 / 或者 - 或者 . 或者 : 或者 单词边界 或者 T 后面的一个数字// \d{1}(?=\/|-|\.|:|\b)   用的是前瞻,查找 / 或者 - 或者 . 或者 : 或者 单词边界  或者 T 前面的一个数字// replace 第二个参数"0$&" 匹配到的字符串前置补0// return str.replace(/(?<=\/|-|\.|:|\b|T)\d{1}(?=\/|-|\.|:|\b|T)/g, "0$&");let regExp = new RegExp("(?<=\/|-|\\.|\:|\\b|T)\\d{1}(?=\/|-|\\.|\:|\\b|T)", "g")return str.replace(regExp, "0$&");
}

时间日期控件,表格内编辑时间控件可用 - (年-月-日)

<el-table-column prop="time" label="时间" width="140"><template slot-scope="scope"><el-date-picker v-if="!!scope.row.addNew || !!scope.row.editRow" :size="elTableTreeFormSize" v-model="scope.row.time" type="date" v-tableYMDFormat value-format="yyyy-MM-dd" @keypress.enter.native="saveRow(scope.row)"></el-date-picker><span v-else>{{ scope.row.time }}</span></template>
</el-table-column>
// 第一种(和时间范围控件相同)
Vue.directive('tableYMDFormat', {inserted: function (el, binding, vnode) {el.addEventListener('change', () => {let value = $($(el).children('input')[0]).val()const time = convertYMDRegExp(value);vnode.child.$emit('input', time);});}
});
// 第二种
Vue.directive('tableYMDFormat', {inserted: function (el, binding, vnode) {const { context: _this } = vnodeif (_this && _this._isVue) {const $this = $($(el).children('input')[0])$this.on('change', function () {let value = $this.val()const time = convertYMDRegExp(value);vnode.child.$emit('input', time);})}}
});

时间范围控件 - (年-月-日)

<el-date-picker v-model="DateArr" type="daterange" v-daterangeYMDFormat value-format="yyyy-MM-dd" range-separator="" start-placeholder="开始" end-placeholder="结束"></el-date-picker>
Vue.directive('daterangeYMDFormat', {inserted: function (el, binding, vnode) {// 绑定 change 事件来更新绑定的数组el.addEventListener('change', () => {let value = []value[0] = $($(el).children('input')[0]).val()value[1] = $($(el).children('input')[1]).val()// const value = [$($(el).children('input')[0]).val(), $($(el).children('input')[1]).val()]const time = value.map(date => convertYMDRegExp(date))vnode.child.$emit('input', time);});}
});

日期转换主要正则

value = value.replace(/[^0-9]/g, '')

年-月-日/年-月-日 时:分/年-月-日 时:分:秒

if (value.length > 5 && value.length < 9) {value = value.replace(/^(\d{4})\D*(\d{1,2})\D*(\d{1,2})\D*/, '$1-$2-$3') // 年-月-日,2021-03-12
} else if (value.length > 9 && value.length < 13) {value = value.replace(/^(\d{4})\D*(\d{1,2})\D*(\d{1,2})\D*(\d{1,2})\D*(\d{1,2})\D*/, '$1-$2-$3 $4:$5') // 年-月-日 时:分,2021-03-12 09:50
} else if (value.length > 12) {value = value.replace(/^(\d{4})\D*(\d{1,2})\D*(\d{1,2})\D*(\d{1,2})\D*(\d{1,2})\D*(\d{1,2})\D*/, '$1-$2-$3 $4:$5:$6') // 年-月-日 时:分:秒,2020-03-12 09:50:30
} else {return ''
}

年-月

// 年-月
if (value.length === 5) {value = value.replace(/^(\d{4})\D*(\d{1})\D*/, '$1-0$2') // 格式化输入格式,2021-03
} else if (value.length > 5) {value = value.replace(/^(\d{4})\D*(\d{1,2})\D*/, '$1-$2') // 格式化输入格式,2021-03
} 

年-月-01/年-01-01

手动补齐'01'

// 年-月-01/
if (value.length > 5 && value.length < 7) { value = value + '01'
}
// 年-01-01
if (value.length <= 4) { value = value + '0101'
} else if (value.length > 4) {value = value.substring(0, 4) + '0101'
}
value = value.replace(/^(\d{4})\D*(\d{1,2})\D*(\d{1,2})\D*/, '$1-$2-$3') // 格式化输入格式

时间日期选择器 - (年-月-日)

 <el-form-item ref="birthday" prop="birthday"><el-date-picker v-model="birthday" type="date" v-dateYMDFormat value-format="yyyy-MM-dd"> </el-date-picker>
</el-form-item>
Vue.directive('dateYMDFormat', {inserted: function (el, binding, vnode) {const { value: _obj } = bindingconst { context: _this, data } = vnodeconst { expression: key } = data.modellet arr = []const modelValue = function (value, len) {// 判断输入的时间为几位数,正则匹配相应的事件格式。可直接采用moment转换,更直接。value = value.replace(/[^0-9]/g, '')if (value.length > 5 && value.length < 9) {value = value.replace(/^(\d{4})\D*(\d{1,2})\D*(\d{1,2})\D*/, '$1-$2-$3') // 格式化输入格式,2021-03-01} else if (value.length > 9 && value.length < 13) {value = value.replace(/^(\d{4})\D*(\d{1,2})\D*(\d{1,2})\D*(\d{1,2})\D*(\d{1,2})\D*/, '$1-$2-$3 $4:$5') // 格式化输入格式,2021-03-01 09:50} else if (value.length > 12) {value = value.replace(/^(\d{4})\D*(\d{1,2})\D*(\d{1,2})\D*(\d{1,2})\D*(\d{1,2})\D*(\d{1,2})\D*/, '$1-$2-$3 $4:$5:$6') // 格式化输入格式,2020-03-01 09:50:30} else {return false}value = supplement(value)// const newValue = value.replace(/-/g,"/"); // 解决前台new Date(yyyy-MM-dd)转化时间相差8小时的问题,不知道靠不靠谱,改用moment// const time = value && value.constructor == String ? new Date(newValue) : value  // 转换时间格式// const time = value && value.constructor == String ? moment(value) : value  // 转换时间格式// const time = value  // 转换时间格式const time = value && value.constructor == String ? value : ''  // 转换时间格式let keys = key.split('.')if (arr.length === len) {arr = [];}arr.push(time)// 判断指令是否有传值,是否有传数组的名称跟索引值,原因:转换出来的时间控件_this[key1][key2]取不到绑定的相关值if (!_obj) {// 处理简单的绑定if (keys && keys.length >= 2) {const [key1, key2, key3, key4] = keysif (key4) {_this[key1][key2][key3][key4] = len === 2 ? arr : time;} else if (key3) {_this[key1][key2][key3] = len === 2 ? arr : time;} else {_this[key1][key2] = len === 2 ? arr : time;}} else {_this[key] = len === 2 ? arr : time;}} else {// 处理循环中的时间控件绑定,需要传值,再去相应的数组中查找相应的字段赋值let objKey = _obj.obj.split('.')if (objKey && objKey.length >= 2) {// 解构赋值const [flag1, flag2, flag3, flag4] = objKey;// _obj.index:索引,_obj.modelName:绑定的字段名if (flag4) {_this[flag1][flag2][flag3][flag4][_obj.index][_obj.modelName] = len === 2 ? arr : time;} else if (flag3) {_this[flag1][flag2][flag3][_obj.index][_obj.modelName] = len === 2 ? arr : time;} else {_this[flag1][flag2][_obj.index][_obj.modelName] = len === 2 ? arr : time;}} else {_this[objKey][_obj.modelName] = len === 2 ? arr : time;}}};if (_this && _this._isVue) {const $this = $($(el).children('input')[0])const $this2 = $($(el).children('input')[1])// 判断是范围的还是单个独立的日期时间控件,范围的两个输入框都要绑定change事件if ($(el).children('input').length > 1) {$this.on('change', function () {let value = $this.val()modelValue(value, 2);})$this2.on('change', function () {let value = $this2.val()modelValue(value, 2);})} else {$this.on('change', function () {let value = $this.val()modelValue(value, 1);})}}}
})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/881789.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【病毒分析】DevicData家族扩散:全球企业和机构成为勒索病毒头号攻击目标!

1.背景 本文聚焦于勒索病毒家族 DevicData 的最新变种&#xff0c;命名为 .DevicData-P a2a9e9c勒索病毒。自2023年1月首次被发现以来&#xff0c;DevicData 家族一直对多个高价值目标展开攻击&#xff0c;包括企业用户、医疗机构和教育机构。这些目标通常持有大量敏感数据&a…

初始爬虫13(js逆向)

为了解决网页端的动态加载&#xff0c;加密设置等&#xff0c;所以需要js逆向操作。 JavaScript逆向可以分为三大部分&#xff1a;寻找入口&#xff0c;调试分析和模拟执行。 1.chrome在爬虫中的作用 1.1preserve log的使用 默认情况下&#xff0c;页面发生跳转之后&#xf…

MySQL学习(五):数据类型与约束

MySQL学习&#xff08;五&#xff09;&#xff1a;数据类型与约束 文章目录 MySQL学习&#xff08;五&#xff09;&#xff1a;数据类型与约束1. 数据类型与属性1.1 所有的数据类型1.2 所有属性 2. 数据类型详解2.1 整型2.2 浮点类型2.3 定点数类型2.4 位类型2.5 日期与时间2.6…

Linux环境基础开发工具的使用

vim编辑器的基本操作: 在linux环境下输入vim 文件名就可以进入编辑模式. 上述四种模式必须退到命令模式才能进行下一个模式. 在编辑器中写完之后,输入ESC进入命令模式,然后再输入shift:进入低行模式并输入wq保存并退出. 在命令模式下的操作: 光标所在行:1.输入yy进行复制, 输…

ubuntu24 root用户修改密码 ubuntu新系统没有创建root用户

ubuntu 系统在虚拟机新建一个ubuntu24&#xff0c;但是在配置系统时候&#xff0c;并没有配置root密码&#xff0c;只是新增了一个自定义账号于密码&#xff0c;在创建好后&#xff0c;可以登录系统&#xff0c;设置root密码~ 1. ubuntu系统初始化后&#xff0c;登录自建账号 …

k8s介绍-搭建k8s

Kubernetes介绍&#xff0c;官网&#xff1a;Kubernetes 应用部署方式演变 传统部署&#xff1a;互联网早期&#xff0c;会直接将应用程序部署在物理机上 优点&#xff1a;简单&#xff0c;不需要其他技术的参与 缺点&#xff1a;不能为应用程序定义资源使用边界&#xff0c…

【C++网络编程】(一)Linux平台下TCP客户/服务端程序

文章目录 Linux平台下TCP客户/服务端程序服务端客户端相关头文件介绍 Linux平台下TCP客户/服务端程序 图片来源&#xff1a;https://subingwen.cn/linux/socket/ 下面实现一个Linux平台下TCP客户/服务端程序&#xff1a;客户端向服务器发送&#xff1a;“你好&#xff0c;服务…

从零创建苹果App应用,不知道怎么申请证书的可以先去看我的上一篇文章

用大家自己的开发者账户&#xff0c;登录进入App Store Connect ,注册自己的应用 进入之后&#xff0c;点击增加 填写相关的信息 一切顺利的话&#xff0c;就可以来到这个页面

element plus的el-select分页

摘要&#xff1a; el-select的数据比较多的时候&#xff0c;必须要分页&#xff0c;处理方案有全部数据回来&#xff0c;或者添加搜索功能&#xff0c;但是就有个问题就是编辑的时候回显问题&#xff0c;必须要保证select的数据有对应的id与name匹配回显&#xff01; <el-fo…

计算机网络-VRRP实验配置

前面我们大致学习了VRRP的概念和基本原理&#xff0c;但是网络这块就是要多敲命令多用才能印象深刻&#xff0c;今天开始进行一些实验配置&#xff0c;结合日常工作的场景分析VRRP在实际工作中的应用。 一、典型VRRP虚拟网关拓扑 相比于传统单网关&#xff0c;采用VRRP虚拟网关…

Qt/C++编写的mqtt调试助手使用说明

一、使用说明 第一步&#xff0c;选择协议前缀&#xff0c;可选mqtt://、mqtts://、ws://、wss://四种&#xff0c;带s结尾的是走ssl通信&#xff0c;ws表示走websocket通信。一般选默认的mqtt://就好。第二步&#xff0c;填写服务所在主机地址&#xff0c;可以是IP地址也可以…

2024.10月11日--- SpringMVC拦截器

拦截器 1 回顾过滤器&#xff1a; Servlet规范中的三大接口&#xff1a;Servlet接口&#xff0c;Filter接口、Listener接口。 过滤器接口&#xff0c;是Servlet2.3版本以来&#xff0c;定义的一种小型的&#xff0c;可插拔的Web组件&#xff0c;可以用来拦截和处理Servlet容…

Python 自动排班表格(代码分享)

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

CentOS安装NVIDIA驱动、CUDA以及nvidia-container-toolkit

0.提前准备 0.1.更新yum源&#xff08;以阿里为例&#xff09; 0.1.1 备份当前的yum源 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 0.1.2 下载新的CentOS-Base.repo 到/etc/yum.repos.d/ CentOS 5 wget -O /etc/yum.repos.d/CentOS-Base…

ORM框架简介

什么是ORM&#xff1f; ORM&#xff08;Object-Relational Mapping&#xff0c;对象关系映射&#xff09;是一种编程技术&#xff0c;用于在关系数据库和对象程序语言之间转换数据。ORM框架允许开发者以面向对象的方式来操作数据库&#xff0c;而不需要编写复杂的SQL语句。简单…

【Linux】命令行下的增删查改之“查看”

致谢:Linux常用命令大全(手册) – 真正好用的Linux命令在线查询网站 提供的命令查询 头部内容获取(head) head命令的功能是显示文件开头的内容&#xff0c;默认值为前10行。 指令参数&#xff1a; -n 定义显示行数 -c 指定显示头部内容的字符数 -v 总是显示文件名的头信…

告别手动计数:智能统计模型用量,释放设计潜力

添加HanTop-MKT&#xff0c;免费获取统计零件数量模型 非标设备行业的设计BOM因为涉及物料采购与装配数量要求&#xff0c;往往面临着需要数据准确性的严格要求&#xff0c;在缺乏自动化工具情况下&#xff0c;手动统计零件用量变得更加困难&#xff0c;且数据准确性得不到保障…

【uniapp】设置公共样式,实现公共背景等

目录 1、 全局渐变背景色 2.1 创建common目录 2.2 在common下新建style和images等目录 2.3 在style下新建common-style.scss 2.4 common-style输入全局渐变颜色 2.5 引入样式 2.6 业务页面引入 2.7 展示 2、全局字体颜色 2.1 新建base-style.scss文件 2.2 设置base-…

07 django管理系统 - 部门管理 - 搜索部门

在dept_list.html中&#xff0c;添加搜索框 <div class"container-fluid"><div style"margin-bottom: 10px" class"clearfix"><div class"panel panel-default"><!-- Default panel contents --><div clas…

Redis 其他类型 渐进式遍历

我们之前已经学过了Redis最常用的五个类型了&#xff0c;然而Redis还有一些在特定场景下比较好用的类型 Redis最关键的五个数据类型&#xff1a; 上面的类型是非常常用&#xff0c;很重要的类型。 除此之外的其他类型不常用&#xff0c;只是在特定的场景能够发挥用处&#…