首页 > 其他分享 >多段区间的时间滑块slider实现方式

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

时间:2024-12-13 12:53:32浏览次数:6  
标签:00 const 滑块 value label slider length 区间 pointArr

多段区间的时间滑块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
这个组件简单易用而且超级方便
image

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;
}

最终实现:

  • 正常状态:
    image
    点击提交后:
    image

  • 重合合并:
    image
    点击提交后:
    image

标签:00,const,滑块,value,label,slider,length,区间,pointArr
From: https://www.cnblogs.com/ProsperousEnding/p/18604693

相关文章

  • 二分查找(灵神思路,区间范围)
    classSolution{public:intlower(vector&nums,inttarget){intn=nums.size();intleft=0;intright=n-1;while(left<=right){intmid=left+(right-left)/2;if(nums[mid]<target){left=mid+1;}elseif(nums[mid]>=target){right=mid-1;}}retu......
  • 一个简单的整数问题(树状数组区间修改,单点查询)
    给定长度为 NN 的数列 AA,然后输入 MM 行操作指令。第一类指令形如 Clrd,表示把数列中第 l∼rl∼r 个数都加 dd。第二类指令形如 Qx,表示询问数列中第 xx 个数的值。对于每个询问,输出一个整数表示答案。输入格式第一行包含两个整数 NN 和 MM。第二行包含......
  • 时间序列预测的不确定性区间估计:基于EnbPI的方法与应用研究
    在现代预测分析领域,准确评估预测结果的不确定性已成为一个关键挑战。预测的不确定性量化不仅能够提供更可靠的决策支持,还能深入揭示模型的预测能力边界。本文聚焦于时间序列预测中的不确定性量化问题,重点探讨基于一致性预测理论的集成批量预测区间(EnsembleBatchPredictionInter......
  • 某滑块验证码识别思路(附完整代码)
    思路验证码类型如下:大概搜索了下,有两种主流思路:yolo目标检测算法和opencv模版匹配。很明显第二种成本远小于第一种,也不需要训练。而且这种验证码有干扰(两个目标点),yolo一次还不能直接到位,还得进一步处理。我在搜索的时候还有用轮廓匹配做识别的,但是实测下来准确率很低,这里就......
  • 合并区间习题分析
    习题:(leetcode56)以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i]=[starti,endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。分析:要得到一个不重叠的区间数组,就是进行比较。为了方便比较,先进行数......
  • 算法编程题-区间列表的交集、飞机座位分配概率
    算法编程题-区间列表的交集、飞机座位分配概率区间列表的交集原题描述思路简述代码实现复杂度分析飞机座位分配概率原题描述思路简述代码实现复杂度分析摘要:本文将介绍两道LeetCode原题,一道是区间列表交集,另外一道则是飞机座位分配概率,实质上是一道常考的智力题。......
  • 【唐叔学算法】第七天:差分算法-高效处理数组区间更新的利器
    你是否曾为如何高效地修改数组中某个区间内所有元素的值而苦恼?差分算法,就像一把神奇的魔法棒,能帮你轻松实现区间修改。今天,就让我们一起揭开差分算法的神秘面纱,探索它在Java编程中的应用。什么是差分?定义差分(Difference)可以看作是前缀和的逆运算。给定一个数组a,其对应的......
  • go时间区间统一值对象
    packagedaterangeimport("git.ichub.com/general/webcli120/goconfig/base/basedto""github.com/gogf/gf/v2/os/gtime""icd/utils""time")typeDateRangestruct{basedto.BaseEntityStart......
  • 区间同余问题
    区间同余问题例题:CF2050FMaximummoduloequality题意给定一个长度为\(n\)的序列\({a_n}\),有\(Q\)个询问,每次询问给定一个区间\([l,r]\),让你找一个最大的\(m\),使得区间内所有的\(a_i\modm\)相同,可以证明一定存在这样一个\(m\)(\(1\))。分析看着很头痛,因为完全不......
  • JavaSwing JSlider
    try{BeautyEyeLNFHelper.frameBorderStyle=BeautyEyeLNFHelper.FrameBorderStyle.osLookAndFeelDecorated;//UIManager.put("RootPane.setupButtonVisible",false);org.jb2011.lnf.beautyeye.BeautyEyeLNFHelpe......