可拖动的时间轴(vue3+ts使用element-plus的Slider滑块封装)

news/2024/11/28 15:49:00/

效果图:

图一:

时间线

 图二:

本文用了vue3+ ts+ element-plus。

HTML代码如下:

<template><div class="slider-demo-block"><el-sliderv-model="value2":step="1"@change="changeSlider":show-tooltip="false":marks="marks":max="getDaysArr.length - 1"/></div>
</template>

封装组件,后端传递开始时间和结束时间,前端算出中间相差多少天

图一效果:后端只传了一个开始时间和结束时间

<script lang="ts">
import { computed, defineComponent, reactive, ref } from 'vue'
//封装了计算开始时间和结束时间的方法
import * as calculate from './calculatetime'
import type { CSSProperties } from 'vue'
interface Mark {style: CSSPropertieslabel: string
}
type Marks = Record<string, Mark | string>
export default defineComponent({props: {startTime: {type: String,default: '2020-2-12',//默认开始时间},endTime: {type: String,default: '2020-3-1',//默认结束时间},},setup(props) {const value2 = ref(0)const getDaysArr = calculate.getDays(props.startTime, props.endTime)//得到开始时间与结束时间相差的天数了const getDaysObj = calculate.arrToObj(getDaysArr)console.log(getDaysObj, 'getDaysObj')const marks = reactive<Marks>(getDaysObj as Marks)const changeSlider = (val) => {//这里拿到滑动到哪一天console.log(getDaysArr[val])return getDaysArr[val]}return {getDaysArr,value2,marks,changeSlider,}},
})
</script>

图二效果:后端传了一个时间数组,包含了一段时间(只需要将图一的getDaysArr 的获取时间段的行为改为时间数组;props默认开始时间和默认结束时间改为时间数组的第一位和最后一位即可,以下代码是一个简单的示例)

<script lang="ts">
import { computed, defineComponent, reactive, ref } from 'vue'
//封装了计算开始时间和结束时间的方法
import * as calculate from './calculatetime'
import type { CSSProperties } from 'vue'
interface Mark {style: CSSPropertieslabel: string
}
type Marks = Record<string, Mark | string>
export default defineComponent({props: {startTime: {type: String,default: '0',//默认开始时间},endTime: {type: String,default: '7200',//默认结束时间},},setup(props) {const value2 = ref(0)const getDaysArr = ['0','3600','7200']//此处为时间数组,就不需要使用封装的计算时间的方法了//得到开始时间与结束时间相差的天数了const getDaysObj = calculate.arrToObj(getDaysArr)console.log(getDaysObj, 'getDaysObj')const marks = reactive<Marks>(getDaysObj as Marks)const changeSlider = (val) => {//这里拿到滑动到哪一天console.log(getDaysArr[val])return getDaysArr[val]}return {getDaysArr,value2,marks,changeSlider,}},
})
</script>

封装计算开始时间与结束时间之间的天数,以及数组转对象的方法

新建calculatetime方法文件,写入以下代码

/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
// 获取间隔天数
export function getDays(day1, day2) {// 获取入参字符串形式日期的Date型日期let st = day1.getDate()const et = day2.getDate()const retArr = []// 获取开始日期的年,月,日let yyyy = st.getFullYear(),mm = st.getMonth(),dd = st.getDate()// 循环while (st.getTime() != et.getTime()) {retArr.push(st.getYMD())if (st.getTime() > et.getTime()) return;st = new Date(yyyy, mm, ++dd); // 避免开始日期添加两次}// 将结束日期的天放进数组retArr.push(et.getYMD())return retArr // 或可换为return ret;// alert(retArr); // 或可换为return ret;
}// 给Date对象添加getYMD方法,获取字符串形式的年月日
Date.prototype.getYMD = function () {// 将结果放在数组中,使用数组的join方法返回连接起来的字符串,并给不足两位的天和月十位上补零return [this.getFullYear(), fz(this.getMonth() + 1), fz(this.getDate())].join('/')
}// 给String对象添加getDate方法,使字符串形式的日期返回为Date型的日期
String.prototype.getDate = function () {const strArr = this.split('-')return new Date(strArr[0], strArr[1] - 1, strArr[2])
}// 给月和天,不足两位的前面补0
function fz(num) {if (num < 10) {num = '0' + num}return num
}// 递归转化为对象
export function arrToObj(arr) {const obj = {}const defaultObj = {}for (let i = 0; i < arr.length; i++) {obj[i] = arr[i]if (Object.prototype.toString.call(arr[i]) == '[object Array]') {const deepArray = this.arrToObj(arr[i])continue} else {defaultObj[i] = arr[i]}}return defaultObj
}

在父组件调用封装的时间轴组件传入需要的参数即可

要实现图二的效果:拖拽了,但是前半部分依旧保持和后半部分一样的填充颜色,以具体实现时间点的效果可以修改原有组件的样式

 <div class="slider-block"><TimeSlider/></div>.slider-block {width: 100%;padding: 40px;margin: auto;:deep().el-slider__bar{background-color: #e6e8ed;}
}

原文/参考链接:可拖动的时间轴(vue3+ts使用element-plus的Slider滑块封装)_vue时间轴拖拽组件模板_cyanempty的博客-CSDN博客


http://www.ppmy.cn/news/380656.html

相关文章

多级缓存测试练习案例导入说明

多级缓存测试练习案例导入说明 1.安装MySQL1.1.准备目录1.2.运行命令1.3.修改配置1.4.重启2.导入SQL3.导入Demo工程3.1.分页查询商品3.2.新增商品3.3.修改商品3.4.修改库存3.5.删除商品3.6.根据id查询商品3.7.根据id查询库存3.8.启动4.导入商品查询页面4.1.运行nginx服务4.2.反…

Question Log(★ > )

★ > “Texture2D”不包含“ignoreMipmapLimit”错误的定义

404. 左叶子之和

2023.6.14 返还条件是遇到空节点或叶子节点时返还 递归逻辑是节点的值等于左孩子加右孩子的值&#xff0c; 其中当左孩子为左叶子节点时就会返还其节点值 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # …

shell 简单比较方法

目的 1 版本比较 2 浮点比较 版本比较 利用 sort -V 功能 function version_gt() { test "$(echo "$@" | tr " " "n" | sort -V | head -n 1)" != "$1"; } function version_le() { test "$(echo "$@" | tr …

Installing SharePoint 2010 on Windows 7

It’s not one hundred percent straight forward to install SharePoint 2010 on Windows 7. Here’s a list of steps that you must take before you’ll be able to create your first Enterprise Wiki : I assume that you have seen System requirements for SharePoint…

sharepoint 2010新功能预览2-Fast Search

这次在微软的SharePoint 2010 Ignite培训中着重介绍了sharepoint 2010中的Fast Search功能&#xff0c;这是微软花了12亿美元收购了挪威OSLO搜索技术公司Fast Search and Transfer&#xff08;FAST&#xff09;&#xff0c;并应用到我们的sharepoint 2010当中&#xff0c;FAST …

试图运行项目时出错,无法启动调试。没有正确安装调试器--很多次都是上网找了很多资料,都很难解决

试图运行项目时出错&#xff0c;无法启动调试。没有正确安装调试器。请运行安装程序安装或修复调试器 收藏 对于这样的问题&#xff0c;出现很多次&#xff0c;很多次都是上网找了很多资料&#xff0c;都很难解决&#xff0c;只好重装IIS或者是.NET。 通过网上搜素一般都是如下…

系统盘(c盘)空间清理方法总结(转)

我们一般会把系统安装在C盘&#xff0c;但是使用一段时间后会发现C盘的空间越来越少。尤其我们做开发的&#xff0c;会在电脑中装上很多软件的。比如我的机器上C盘空间15G&#xff0c;平时安装软件时只要可以选择我都会把它装到其他盘的&#xff0c;但是半年下来&#xff0c;C盘…