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

news/2024/10/21 7:55:36/

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

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


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

javascript">import '@/components/common/js/direct.js'

direct.js

公共部分

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

javascript">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>
javascript">// 第一种(和时间范围控件相同)
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>
javascript">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);});}
});

日期转换主要正则

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

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

javascript">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 ''
}

年-月

javascript">// 年-月
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'

javascript">// 年-月-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>
javascript">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.ppmy.cn/news/1538095.html

相关文章

力扣58-最后一个单词的长度

题目 给你一个字符串 s&#xff0c;由若干单词组成&#xff0c;单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大子字符串 示例 1&#xff1a; 输入&#xff1a;s "Hello World" 输出&#xf…

专业软件许可证监测系统的设计与实现

摘要&#xff1a;整车企业每年投入大量资金采购各类专业软件&#xff0c;为掌握软件许可证的真实需求&#xff0c;建立了专业软件许可证监测系统&#xff0c;实现在公司范围内软件集中管理和统一监控&#xff0c;节约软件投资成本。该研究提出了软件许可证监测系统的设计思路和…

基于开元鸿蒙(OpenHarmony)的【智能药房与药品管理综合应用系统】

基于开元鸿蒙OpenHarmony的【智能药房与药品管理综合应用系统】 一、系统背景与OpenHarmony简介二、智能药房与药品管理综合应用系统1. 系统概述2. 智能药房管理系统3. 药品追溯系统4. 电子处方系统 三、系统优势与应用前景四、智能药房与药品管理综合应用系统的未来1、技术融合…

数据驱动决策:低代码平台如何助力智能化业务分析

引言 在当今这个数据至上的时代&#xff0c;企业的决策越来越依赖于数据的驱动。无论是市场趋势预测、客户行为分析&#xff0c;还是内部运营优化&#xff0c;数据都扮演着至关重要的角色。然而&#xff0c;随着数据量的急剧增长和复杂性的增加&#xff0c;如何高效地收集、处理…

考研笔记之操作系统(四) - 文件管理

文件管理 1. 简介1.1 前情回顾1.2 文件的属性1.3 文件内部数据的组织方式1.4 操作系统向上提供的文件功能1.5 文件应如何放在外存 2. 文件的逻辑结构2.1 无结构文件2.2 有结构文件2.2.1 顺序文件2.2.2 索引文件2.2.3 索引顺序文件2.2.4 多级索引顺序文件 3. 文件目录3.1 基本概…

【时时三省】(C语言基础)字符函数和字符串函数目录

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 字符函数和字符串函数 目录&#xff1a; 求字符串长度 strlen 长度不受限制的字符串函数 strcpy strcat strcmp 长度受限制的字符串函数介绍 strgcpy strncat strncmp 字符串查…

云贝教育 |【技术文章】ZABBIX 6.4配置中文界面

本文为云贝教育 刘老师 原创&#xff0c;请尊重知识产权&#xff0c;转发请注明出处&#xff0c;不接受任何抄袭、演绎和未经注明出处的转载。 Zabbix 是一个广泛使用的开源监控解决方案&#xff0c;支持多种语言界面。本文将详细介绍如何配置 Zabbix 以使用中文界面&#xff0…

学习周易的意义

学习周易的意义在哪里呢&#xff1f;当今时代&#xff0c;书店里面&#xff0c;淘宝店里面&#xff0c;可以看到的书都是有很多的。我们想要了解经济学的知识&#xff0c;可以去买经济学的书籍。想要了解&#xff0c;投资&#xff0c;保险&#xff0c;股票的知识&#xff0c;也…