最近遇到一个需求,需要一个输入时长的组件,在经过一番寻找后没有合适的,最终自己动手写一个(实现了v-model双向绑定),记录一下,也给小伙伴们提供一个方便。
本示例基于ant design of vue实现,如使用其他组件库的可以参照实现,原理大同小异。

<!--本示例仅提供基础方法,如有其他需求可动手实现,也可以通过评论提出-->
<l-duration v-model="value"/>
模板文件部分
<template><a-popover trigger="click" placement="bottom" @visibleChange="handleVisibleChange"><a-input v-model="showValue" read-only :disabled="disabled"/><template #content><a-input-number v-model="hour" :min="0" :precision="0"/>时<a-input-number v-model="minute" :min="0" :precision="0"/>分</template></a-popover>
</template><script>
import {isNumber, minutesToDate, parseCustomDate} from "@/dateUtil";
import arithmetic from "@/arithmetic";export default {name: "LDuration",model: {prop: 'value',event: 'change'},props: {value: {type: Number,default: undefined,},disabled: {type: Boolean,default: false,}},data() {return {showValue: "",hour: undefined,minute: undefined,}},watch: {value(newVal) {if (isNumber(newVal)) {let customDate = minutesToDate(newVal, 'hm')this.showValue = parseCustomDate(customDate)this.hour = customDate.hourthis.minute = customDate.minute} else {this.showValue = ""this.hour = undefinedthis.minute = undefined}}},methods: {handleVisibleChange(visible) {if (!visible) {//计算时长,单位:分钟,延迟一会再算setTimeout(() => {let hour = this.hour, minute = this.minute, value = undefinedif (isNumber(hour) || isNumber(minute)) {value = arithmetic.add(arithmetic.multiply(hour || 0, 60), minute || 0).toNumber()}this.$emit('change', value)}, 100)}},}
}
</script>
公共方法之dateUtil.js
/*** 是否为数字*/
export function isNumber(obj) {return typeof obj === 'number' && !isNaN(obj)
}/*** 分钟转日期格式** @param {Number} minutes 分钟* @param {String} formatter='dhm' 格式 [d:日,h:时,m:分]* @author 乐享生活522* @date 2022/5/17 15:44*/export function minutesToDate(minutes, formatter = 'dhm') {if (!isNumber(minutes)) {return undefined}let day = 0, hour = 0, minute = 0if (formatter === 'dhm') {day = Math.floor(minutes / (60 * 24));hour = Math.floor(minutes / 60 % 24);minute = Math.ceil((minutes % 60));} else if (formatter === 'hm') {hour = Math.floor(minutes / 60);minute = Math.ceil((minutes % 60));} else {minute = minutes;}return {day, hour, minute}
}/*** 解析自定义日期** @param {Object} customDate 自定义日期格式的对象* @param {Number} customDate.day 天* @param {Number} customDate.hour 时* @param {Number} customDate.minute 分* @author 乐享生活522* @date 2022/5/17 16:12*/
export function parseCustomDate(customDate) {let result = ''let {day, hour, minute} = customDateif (day) {result += day + '天';}if (hour) {result += hour + '时';}if (minute) {result += minute + '分';}return result
}
公共方法之arithmetic
//依赖math.js相关方法
import {create, all} from 'mathjs'//使用配置创建一个mathjs实例
const config = {number: 'BigNumber',precision: 64,//默认情况下为64,仅适用于BigNumbers
}
const math = create(all, config)let arithmetic = {//加法add(num1, num2) {return math.add(math.bignumber(num1), math.bignumber(num2));},//减法subtract(num1, num2) {return math.subtract(math.bignumber(num1), math.bignumber(num2));},//乘法multiply(num1, num2) {return math.multiply(math.bignumber(num1), math.bignumber(num2));},// 除法divide(num1, num2, fractionDigits) {let quotient = math.divide(math.bignumber(num1), math.bignumber(num2))if (fractionDigits) {return math.round(quotient, fractionDigits)}return quotient;},//四舍五入round(num, fractionDigits) {return math.round(num, fractionDigits)}}
export default arithmetic;

基于Ant Design of Vue实现时长组件 duration相关推荐

  1. 使用Ant Design 和Vue,React中后台开发套餐

    2019独角兽企业重金招聘Python工程师标准>>> 前言 目前Ant Design 提供 React 和 Vue 两种整合开发框架,开箱即用的中台前端/设计解决方案,可适合中小公 ...

  2. Vue.js高效前端开发 • 【Ant Design of Vue框架进阶】

    全部章节 >>>> 文章目录 一.栅格组件 1.栅格组件介绍 2.栅格组件使用 3.实践练习 二.输入组件 1.输入框组件使用 2.选择器组件使用 3.单选框组件使用 4.实践 ...

  3. 创建Vue+TS+Ant Design of Vue 项目

    创建Vue+TS+Ant Design of Vue 项目 创建项目 选择配置 运行项目 安装 ant-design-vue 安装 babel-plugin-import 使用VS Code打开 配置 ...

  4. Ant Design of Vue +TS 表单动态增加数据验证卧坑姿势

    文章目录 Update 20210601 Update 20210525 原文: 1.a-form的model 2.获取数据 源码 Update 20210601 今天做别的页面的时候发现又取不到数据 ...

  5. 基于Ant Design和jQuery UI的表单设计器

    基于Ant Design 和jQuery UI 的表单设计器 GitHub 地址 概念 Comonent 组件 Layout 布局,一种特殊的Component Component Editor 组件 ...

  6. ant design pro vue 动态路由 流程详解

    ant design pro vue 动态路由 流程详解 前言 流程图 流程1 src/permission.js 流程2 src/store/modules/user.js 流程3 src/perm ...

  7. React 基于ant design Pro 4 实现的一个分页, 自定义页码颜色

    标题目录 代码 样式 前言 这是在 Ant Design Pro 4 中基于 ant design 的 Pagination 分页组件的基础上开发的. 有这么一个需求, 页码的颜色基于该页是否有差异, ...

  8. 一种基于Gradient Boosting的公交车运行时长预测方法

    一种基于Gradient Boosting的公交车运行时长预测方法 赖永炫1,2, 杨旭3, 曹琦4, 曹辉彬1,2, 王田5, 杨帆6 1 厦门大学信息学院,福建 厦门 361005 2 厦门大学深 ...

  9. ant design of vue分页/layui实现分页

    ant design of vue分页 官方文档:https://www.antdv.com/components/pagination-cn/ 结果: 代码: <a-paginationv-i ...

最新文章

  1. AttributeError: module ‘tensorflow‘ has no attribute ‘applications‘
  2. 超长整数相加 c语言类,二个超长正整数的相加
  3. python 视频转场_视频剪辑什么鬼?Python 带你高效创作短视频
  4. lombok @Builder注解的使用
  5. 【建议收藏】二叉树的序列化与反序列化
  6. 管理日志--项目管理科学的产生与发展
  7. win32 注册表操作
  8. 戴尔电脑正在准备自动修复_戴尔如何建立社区为开放的未来做准备
  9. Veeam 9.5U3集中管理Agent详解
  10. EL表达式中,param和requestScope的区别
  11. gvim 命令行粘贴_vim-如何在光标所在的行中粘贴?
  12. gmssl编译linux,linux 编译安装GmSSL记录
  13. stc15流水灯c语言,STC89C52单片机流水灯
  14. 2021秋季《数据结构》_EOJ 1086.哥尼斯堡的七桥问题
  15. 支付宝推出信用租房 醉翁之意不在酒?
  16. 【工作感悟】职场工作感悟(一)
  17. 什么是等保三级?等保三级的认证流程有哪些?
  18. php源码中powerby,小龙源码网 - discuz论坛怎么去掉power by discuz版权
  19. 计算机专业、物联网工程大一寒假规划必备篇
  20. 实用工具分享-桌面美化软件Fences

热门文章

  1. 河南理工大学计算机学院杨合超,模式识别的主要方法及其应用
  2. 【What if 系列】小世界
  3. 数据聚合 错误的请求KEY 排除KEY失效
  4. 分包组包 北斗通信_一种利用北斗短报文实现第三方数据双向传输的方法与流程...
  5. 大话DFT频谱分析(并不是我的话)
  6. 国内做SRM系统的公司哪家比较好?如何利用SRM系统管理好供应商?
  7. 7.features特征
  8. 爱甲专线分享甲状腺随访大数据多中心平台建设经验,与会专家广泛关注
  9. homeassistant — 三种卡片在lovelace中显示实体的某个属性值
  10. 谈谈自己为公司设计的jmeter自动化部署框架