多段区间的时间滑块slider实现方式

写在前面:今天要实现一个尖峰平谷的数据配置,这可一下难倒我了,但是还好互联网上大神云集,感谢各位大神的倾情分享,现在就写下我的感悟,留给看到这篇文章的你

参考链接--写在前面,希望好帖子和文章能够被更好的被发现

  1. 首先就是查看功能的大神贴,也是一切的基础

https://blog.csdn.net/qq_40950174/article/details/128829529

  1. 基于这个功能去实现时间滑块的参考

https://juejin.cn/post/7028885491617366053

  1. 组件参考:

    vue-range-multi

https://github.com/wiidede/vue-range-multi

这个组件简单易用而且超级方便

vue-slider-component --

vue2的版本,个人喜欢这份文档,但是我用的vue3所以没有使用

https://github.com/NightCatSama/vue-slider-component

vue3-slider-component

最终参考:

https://github.com/s-sasaki-0529/vue-slider-component

实现:

有了前面的参考利器,写起来就方便很多了

思路:添加一个按钮,每次点击添加时,向内部添加一个容量为2的数组,然后通过数组的长度进行进度条渲染,在最后点击提交时对数组进行合并处理

我用的是个笨办法,如果有更好的办法,欢迎底下留言。

首先就是组件部分

<el-button type="primary" @click="addPoint">添加时间段</el-button>
<el-button type="danger" @click="delPoint">删除时间段</el-button>
<el-button type="success" @click="submit">提交</el-button>
<VueSlider
v-model="pointArr"
:data="dataInit"
:process="getProcess"
:lazy="true"
:adsorb="true"
:drag-on-click="true"
tooltip="hover"
/>

然后就是js部分

const pointArr = ref([0, 1])
const dataInit = ref([
{value: 0, label: '0:00'},
{value: 1, label: '1:00'},
{value: 2, label: '2:00'},
{value: 3, label: '3:00'},
{value: 4, label: '4:00'},
{value: 5, label: '5:00'},
{value: 6, label: '6:00'},
{value: 7, label: '7:00'},
{value: 8, label: '8:00'},
{value: 9, label: '9:00'},
{value: 10, label: '10:00'},
{value: 11, label: '11:00'},
{value: 12, label: '12:00'},
{value: 13, label: '13:00'},
{value: 14, label: '14:00'},
{value: 15, label: '15:00'},
{value: 16, label: '16:00'},
{value: 17, label: '17:00'},
{value: 18, label: '18:00'},
{value: 19, label: '19:00'},
{value: 20, label: '20:00'},
{value: 21, label: '21:00'},
{value: 22, label: '22:00'},
{value: 23, label: '23:00'},
]
)
//控制进度条的颜色
const getProcess = (pointArr:any) => {
const newArr = []
for (let i = 0; i < pointArr.length-1; i+=2) {
newArr.push(([pointArr[i], pointArr[i + 1], {backgroundColor: 'pink'}]))
}
return newArr
} //添加点位区间
const addPoint = () => {
const length = pointArr.value.length;
if (length < 2) {
return;
}
const newArr = [pointArr.value.length, pointArr.value.length + 1]
pointArr.value.push(...newArr);
const lastIndex = pointArr.value.length - 2;
const secondLastIndex = pointArr.value.length - 1;
const arrRule = [pointArr.value[lastIndex], pointArr.value[secondLastIndex], {backgroundColor: 'pink'}];
getProcess(pointArr).push(arrRule)
} //删除上一个区间
const delPoint = () => {
const length = pointArr.value.length;
if (length <= 2) {
return;
}
pointArr.value.pop();
pointArr.value.pop();
getProcess(pointArr).pop()
} //合并区间
const submit = () => {
console.log(pointArr.value);
const result = []; // 创建一个数组来存储处理后的区间
const processedIntervals = []; for (let i = 0; i < pointArr.value.length; i += 2) {
const start = pointArr.value[i];
const end = pointArr.value[i + 1]; // 初始化一个新的区间
let newInterval = [start, end]; // 检查是否有交叉的区间需要合并
if (processedIntervals.length > 0) {
let lastInterval = processedIntervals[processedIntervals.length - 1];
if (lastInterval[1] >= start) {
// 有交叉,合并区间
lastInterval[1] = Math.max(lastInterval[1], end);
} else {
// 无交叉,添加新区间
processedIntervals.push(newInterval);
}
} else {
// 第一个区间,直接添加
processedIntervals.push(newInterval);
}
} // 处理 processedIntervals,生成最终的结果
for (const interval of processedIntervals) {
if (interval[0] === interval[1]) {
result.push([interval[0]]);
} else {
result.push([interval[0], interval[1]]);
}
}
console.log(result);
return result;
}

最终实现:

  • 正常状态:



    点击提交后:

  • 重合合并:



    点击提交后:

多段区间的时间滑块slider实现方式的更多相关文章

  1. Help Hanzo lightof 1197 求一段区间内素数个数,[l,r] 在 [1,1e9] 范围内。r-l<=1e5; 采用和平常筛素数的方法。平移区间即可。

    /** 题目:Help Hanzo lightof 1197 链接:https://vjudge.net/contest/154246#problem/M 题意:求一段区间内素数个数,[l,r] 在 ...

  2. hdu 5489——Removed Interval——————【删除一段区间后的LIS】

    Removed Interval Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  3. C语言获取系统时间的几种方式[转]

    C语言获取系统时间的几种方式 C语言中如何获取时间?精度如何? 1 使用time_t time( time_t * timer ) 精确到秒 2 使用clock_t clock() 得到的是CPU时间 ...

  4. C语言获取系统时间的几种方式

    C语言获取系统时间的几种方式 2009-07-22 11:18:50|  分类: 编程学习 |字号 订阅     C语言中如何获取时间?精度如何? 1 使用time_t time( time_t * ...

  5. java向MySQL插入当前时间的四种方式和java时间日期格式化的几种方法(案例说明)

    转载地址:http://www.devba.com/index.php/archives/4581.html java向MySQL插入当前时间的四种方式和java时间日期格式化的几种方法(案例说明); ...

  6. (转)java向MySQL插入当前时间的四种方式和java时间日期格式化的几种方法(案例说明)

    java向MySQL插入当前时间的四种方式和java时间日期格式化的几种方法(案例说明);部分资料参考网络资源 1. java向MySQL插入当前时间的四种方式 第一种:将java.util.Date ...

  7. Js:消息弹出框、获取时间区间、时间格式、easyui datebox 自定义校验、表单数据转化json、控制两个日期不能只填一个

    (function ($) { $.messageBox = function (message) { $.messager.show({ title:'消息框提示', msg:message, sh ...

  8. HDU 1024 Max Sum Plus Plus ——(M段区间的最大和)

    感觉有点奇怪的是这题明明是n^2的复杂度,n=1e6竟然能过= =.应该是数据水了. dp[i][j]表示前j个数,分成i段,且最后一段的最后一个为a[j]的答案.那么转移式是:dp[i][j] = ...

  9. 基于jQuery-ui实现多滑块slider

    效果图: 代码: <!doctype html> <html lang="en"> <head> <meta charset=" ...

  10. cf 366D D. Dima and Trap Graph (计算所有线段共同覆盖的某段区间)

    http://codeforces.com/problemset/problem/366/D 题意:给出n个点,m条边,a,b,ll,rr分别代表点a,点b相连,点a和点b的区间范围(ll,rr),然 ...

随机推荐

  1. shell脚本参数读取列表文件,循环执行时,要注意这个列表文件转换成 unix 格式

    当报一些很奇怪的错,比如报错多了一个空格,但 vim 看打开没有,比如: 或者肉眼看上去路径正常,但却报路径不存在: 这种时候要使用 dos2unix 工具,把这个列表文件转换一下:

  2. 新手指南-新人入职-maven相关

    一.前言 入职后,发现公司是用Maven对项目进行管理和构建. 一般来说,自己先确定以下几点: 1.公司对版本是否有要求. 2.是否要求IDEA对maven有特殊的配置. 3.确定自己的 MAVEN_ ...

  3. 【VMware VCF】使用 SoS 实用程序检查 VCF 环境的运行状态以及收集组件的日志信息。

    VMware Cloud Foundation 解决方案中有一个叫 Supportability and Serviceability(SoS)可支持性和可维护性的实用程序,可能你在初始构建 VCF ...

  4. perf时 出现[kernel.kallsyms] 符号怎么办

    在 perf 工具生成的火焰图中看到 [kernel.kallsyms],通常意味着火焰图中包含内核符号,但这些符号没有被正确解析.这可能是由于以下几个原因导致的: 内核符号表不可用或不完整:perf ...

  5. 批量解压zip文件到指定位置

    话不多说,直接上代码. # coding:utf-8 import zipfile import utils_file n = 21 # 我事先知道我有多少个文件,所以确定为21 for i in r ...

  6. 6.flask 源码解析:响应

    目录 一.flask 源码解析:响应 1.1 response 简介 1.2 flask 响应(response) 1.3 werkzeug response 1.4 自定义 response Fla ...

  7. 2021CSP复赛游记,总结与回顾

    一曲起,一曲落:2021的CSP复赛也走过一个月了. 总而言之,成败只代表过去,过去不代表未来,收获满满,受益匪浅,足矣 今年,是我参加CSP的第四年,回忆当初踏入信息学的大门,跌倒过,受伤过,但从没 ...

  8. 【Azure Cloud Service】使用Key Vault Secret添加.CER证书到Cloud Service Extended Support中

    问题描述 因为Key Vault的证书上传功能中,只支持pfx格式的证书,而中间证书,根证书不能转换为pfx格式,只能是公钥证书格式 cet 或者 crt,能通过文本工具直接查看base64编码内容. ...

  9. KubeSphere 3.3.2 版本正式发布!

    距离上一个版本 v3.3.1 发布,已经过了 3 个多月,今天我们很高兴宣布 KubeSphere v3.3.2 正式发布! 此版本由 68 位贡献者参与代码提交,感谢各位贡献者对 KubeSpher ...

  10. 出现负载均衡问题IP端口不通的紧急处理

    出现负载均衡IP不能用的处理方案,重启这个服务. 命令: systemctl stop keepalived systemctl start keepalived